HarmonyOS 鸿蒙Next中怎么解决H5通过schema唤起APP失败的问题

HarmonyOS 鸿蒙Next中怎么解决H5通过schema唤起APP失败的问题

【问题现象】

Web组件加载H5页面,H5通过schema跳转三方APP,跳转失败。

【背景知识】

  • 通过Deep Linking跳转:系统会根据接口中传入的uri信息,在本地已安装的应用中寻找到符合条件的应用并进行拉起。当匹配到多个应用时,会拉起应用选择框。详见指导
  • 通过App Linking跳转:系统会根据接口传入的uri信息(HTTPS链接)将用户引导至目标应用中的特定内容,无论应用是否已安装,用户都可以访问到链接对应的内容,整个跳转体验相比Deep Linking方式更加顺畅。详见指导
  • 通过Want信息跳转:显式Want跳转提供参数bundleName、moduleName和abilityName,隐式Want跳转不再提供bundleName、moduleName和abilityName,使用uri进行跳转。详见指导
  • Web拦截请求:通过onLoadIntercept拦截H5请求,详见指导
  • openLink打开应用:通过AppLinking启动UIAbility,使用Promise异步回调。仅支持在主线程调用,详见指导
  • startAbility打开应用:启动Ability,使用callback异步回调。仅支持在主线程调用,详见指导

【定位思路】

H5内通过a标签跳转,不做处理只会进行H5的路由跳转,不能够唤起三方应用,所以需要拦截url请求再做处理。

【解决方案】

1. 主应用拦截请求

拦截Web组件的H5请求,如果请求地址符合schema,则可以通过以下三种方式唤起三方应用。

(1)APP侧代码:

import { webview } from '@kit.ArkWeb';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  controller: WebviewController = new webview.WebviewController();

  build() {
    Column() {
      Web({
        src: 'www.example.com',
        controller: this.controller
      })
        .onLoadIntercept((event) => {
          const url = event.data.getRequestUrl();
          //拦截H5的请求,匹配对应schema
          if (url == "xxx://xxxx") {
            //调用元能力接口拉起APP
            //....
            return true
          }
          return false
        })
    }
    .width('100%')
    .height('100%')
  }
}

(2)H5侧代码:

<a id="a" href="xxx://xxxx">打开APP</a>
<script>
   window.onload=function(){
     document.getElementById("a").click();
   }
</script>

2. 拉起应用

通过第一步拦截url请求,就可以在适当的时机拉起应用。

使用startAbility通过Want信息跳转:

let want: Want = {
  bundleName: "com.test.example",
  moduleName: "entry",
  abilityName: "EntryAbility"
};
try {
  context.startAbility(want)
    .then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, `startAbility failed. Code is ${err.code}, message is ${err.message}`);
    })
} catch (paramError) {
  hilog.error(DOMAIN_NUMBER, TAG, `Failed to startAbility. Code is ${paramError.code}, message is ${paramError.message}`);
}

或使用openLink通过Deep Linking或App Linking跳转:

let link: string = "https://www.example.com";
let openLinkOptions: OpenLinkOptions = {
  // 匹配的abilities选项是否需要通过AppLinking域名校验,匹配到唯一配置过的应用ability
  appLinkingOnly: true,
  // 同want中的parameter,用于传递的参数
  parameters: {demo_key: "demo_value"}
};

try {
  context.openLink(link, openLinkOptions)
    .then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, 'open link success.');
    }).catch((err: BusinessError) => {
    hilog.error(DOMAIN_NUMBER, TAG, `open link failed. Code is ${err.code}, message is ${err.message}`);
  })
} catch (paramError) {
  hilog.error(DOMAIN_NUMBER, TAG, `Failed to start link. Code is ${paramError.code}, message is ${paramError.message}`);
}

详见指导


更多关于HarmonyOS 鸿蒙Next中怎么解决H5通过schema唤起APP失败的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next中怎么解决H5通过schema唤起APP失败的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,H5通过schema唤起APP失败可能由以下原因导致:

  1. Schema未正确配置:确保在config.json中正确配置了abilitiesuri字段,且与H5页面中的schema一致。

  2. 权限问题:检查是否在config.json中声明了ohos.permission.START_ABILITIES_FROM_BACKGROUND权限。

  3. 应用未安装或未启动:确保目标应用已安装并处于可运行状态。

  4. H5页面schema格式错误:H5页面中的schema格式应为<schema>://<path>,且与config.json中的配置完全匹配。

  5. 系统版本兼容性:确认设备系统版本支持schema唤起功能。

  6. 调试日志:通过HiLog打印日志,检查是否有相关错误信息。

  7. 网络问题:确保网络连接正常,避免因网络问题导致唤起失败。

  8. 应用包名匹配:H5页面中的schema应与目标应用的包名一致。

通过以上步骤排查问题,确保schema配置正确且应用状态正常。

回到顶部