HarmonyOS 鸿蒙Next Linking.canOpenURL(url)检测是否能打开时返回false,实际可以直接打开 Linking.openURL(url)

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Linking.canOpenURL(url)检测是否能打开时返回false,实际可以直接打开 Linking.openURL(url)

Linking.canOpenURL(url)鸿蒙检测是否能打开时候返回false,实际可以直接打开 Linking.openURL(url)

2 回复

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解释

  1. hwtips:// 是玩机技巧APP的协议头,表示这是一个玩机技巧APP的链接。

  2. com.huawei.hmos.tips.app 是玩机技巧APP的主域名,表示这个链接是由玩机技巧APP生成的。

  3. 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的权限检测机制与实际应用行为不完全一致导致的。可能的原因包括:

  1. 权限配置:确保你的应用已在manifest.json或相应的权限配置文件中声明了必要的网络或URL访问权限。

  2. URL格式canOpenURL可能对URL的格式有更严格的检查,比如是否包含协议头(如http://https://)。确保传递给canOpenURL的URL格式正确无误。

  3. 系统缓存:某些情况下,系统缓存可能导致canOpenURL的结果不准确。尝试清除应用缓存或重启设备看是否解决问题。

  4. API行为差异:不同版本的HarmonyOS可能在API实现上存在差异。检查你正在使用的HarmonyOS版本与官方文档是否一致,确认是否存在已知的API行为变更。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部