HarmonyOS 鸿蒙Next Linking.canOpenURL(url)检测是否能打开时返回false,实际可以直接打开 Linking.openURL(url)
HarmonyOS 鸿蒙Next Linking.canOpenURL(url)检测是否能打开时返回false,实际可以直接打开 Linking.openURL(url)
H5通过url scheme拉起对应应用
场景描述
三方应用使用过程中,可能会在应用或浏览器的H5页面中需要跳转到其它应用,本文档提供了H5跳转页面的方法
H5对于已安装应用拉起应用,对于未安装应用拉起应用市场进行下载
如果在项目中则使用startAbility打开deepLink进行拉起应用,如果在浏览器中打开H5页面,则绑定点击事件,点击按钮后window.open(deepLink)进行跳转
常见场景:通过deepLink H5对于已安装应用拉起应用,对于未安装应用拉起应用市场进行下载
1 通过onLoadIntercept拦截前端H5请求,进行url判断
2 检测url类型,是否类型正确
3 使用bundleManager.canOpenLink检测是否可以打开相关应用
4 已安装应用则拉起
5未安装应用跳转应用市场进行下载
相关配置:
1:在拉起方的module.json5文件中配置querySchemes字段,表示本应用可能会用到的scheme查询。
"module": {
"querySchemes": [
"hwtips",
],
}
2:在被拉起方的module.json文件中的skill字段中配置该应用支持的scheme协议,表示这个应用可以通过此协议打开,例如玩机技巧应用想被成功拉起则需要玩机技巧应用在工程的model.json5文件中配置abilities的skills中配置
"abilities": [
{
"skills": [
{
"actions": [
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "hwtips"
}
]
}
]
}
]
3:以玩机技巧为例H5页面。玩机技巧网页需要给自己的应用拉活,因此在网页中添加按钮引导用户拉起玩机技巧应用。网页端直接提示打开玩机技巧应用按钮绑定点击事件window.open(‘hwtips://com.huawei.hmos.tips.app?funNum=xxx&type=xxx’),点击该按钮,打开网页web端收到的url为
'hwtips://com.huawei.hmos.tips.app?funNum=xxx&type=xxx'
<!DOCTYPE html>
<html>
<body>
<div>
<button type="button" onclick="goToLink()">拉起应用</button>
</div>
</body>
</html>
<script>
function goToLink() {
window.open('hwtips://com.huawei.hmos.tips.app?funNum=xxx&type=xxx')
}
</script>
url解释
-
hwtips:// 是玩机技巧APP的协议头,表示这是一个玩机技巧APP的链接。
-
com.huawei.hmos.tips.app 是玩机技巧APP的主域名,表示这个链接是由玩机技巧APP生成的。
-
funNum=xxx&type=xxx 是链接的参数,表示要跳转到的具体页面。XXX是一个代表具体页面的字符串,可以是详情页、咨询页等。
核心代码
1:使用webView onLoadIntercept拦截前端请求,目的是获取拉起应用的url,也可以使用应用侧与前端交互方法获取url例如
javaScriptProxy
Web({ src: $rawfile('wanjijiqiao.html'), controller: this.controller })
.onLoadIntercept((event) => {
if (event) {
let url: string = event.data.getRequestUrl();
})
2: 使用bundleManager.canOpenLink检测是否可以打开相关应用,可以打开则拉起应用
if (canOpen) {
const want: Want = {
uri: url
}
const context = getContext(this) as common.UIAbilityContext;
context.startAbility(want).then(() => {
//拉起成功
}).catch(() => {
console.log('...error, code:' + error.code + ', message:' + error.message);
})
}
3:未安装,不可打开则跳转应用市场进行下载
else
{
promptAction.showDialog({
title: '提示',
message: '应用未下载前去应用市场',
buttons: [{
text: '确定',
color: '#41464b',
}]
});
setTimeout(() => {
// 拉起失败
const want: Want = {
uri: `store://appgallery.huawei.com/app/detail?id=C1229502635594278976`
}
const context = getContext(this) as common.UIAbilityContext;
context.startAbility(want).then(() => {
//拉起成功
})
}, 1000)
}
1 id=C1229502635594278976是应该上架应用市场才有的标识id,通过此id可以跳转到对应app下载页面
2 查询AppId参考:https://developer.huawei.com/consumer/cn/doc/pay-docs/hwzf-appidchaxun-0000001771485541
项目代码见附件
常见问题:
跳转want的有哪些参数可以配置?
want跳转配置的参数参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-ability-want-0000001774280570
在module.json5文件中配置querySchemes字段为什么会报错?
上述能力在5.0 canary1 api12 版本开始支持,开发者需要使用齐套的2D套件。
web会对deeplink链接做任何解析或处理吗?
另外web不会对deeplink链接做任何解析或处理,只会原封不动的传递给拉起的应用。因此第三方应用只需要自己的网页端和应用端协商好url规则,自己去做解析打开对应页面即可
webView 支持UniversalLink方式进行跳转吗?
Web将会在6月下旬支持UniversalLink,内核的导航模块进入对应的触发导航事件流程。在其中如果是非http/https协议,则跳过。针对http/https协议,Web内核请求元能力执行openLink,如果是如果该URL是有效UniversalLink且对应应用已安装,将直接打开该应用,而不执行原有的URL网页导航。如不是,则执行原URL链接进行网页导航。
参考Linking.canOpenURL(url)配置下querySchemes属性试试
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/canopenlink-V5
针对你提到的HarmonyOS鸿蒙系统中Linking.canOpenURL(url)
返回false
,但Linking.openURL(url)
能成功打开URL的问题,这通常是由于系统API的权限检测机制与实际应用行为不完全一致导致的。可能的原因包括:
-
权限配置:确保你的应用已在
manifest.json
或相应的权限配置文件中声明了必要的网络或URL访问权限。 -
URL格式:
canOpenURL
可能对URL的格式有更严格的检查,比如是否包含协议头(如http://
或https://
)。确保传递给canOpenURL
的URL格式正确无误。 -
系统缓存:某些情况下,系统缓存可能导致
canOpenURL
的结果不准确。尝试清除应用缓存或重启设备看是否解决问题。 -
API行为差异:不同版本的HarmonyOS可能在API实现上存在差异。检查你正在使用的HarmonyOS版本与官方文档是否一致,确认是否存在已知的API行为变更。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html