HarmonyOS鸿蒙Next中如何实现元服务生成二维码并跳转指定页面?微信扫码是否可行?applinking不满足需求时的替代方案

HarmonyOS鸿蒙Next中如何实现元服务生成二维码并跳转指定页面?微信扫码是否可行?applinking不满足需求时的替代方案 【问题描述】:现在要实现一个功能,我在元服务生成一个二维码,别的手机扫二维码(微信扫码可不可以,还是只能用手机系统扫码),跳转到元服务指定页面,这个功能能实现吗?如何实现呢,applinking满足不了我的需求,有其他的方法吗?

【问题现象】:不涉及

【版本信息】:不涉及

【复现代码】:不涉及

【尝试解决方案】:参考了文档:https://developer.huawei.com/consumer/cn/doc/atomic-ascf/ascf-applinking使用AppLinking生成短链,通过短链生成二维码,然后扫码打开元服务并进入指定页面。

但经过测试这个到指定页面没问题,但是主要是我要生成动态的参数,例如ascfPara={“path”:"/pages/menu",“recordid”:1231515},这个recordId是随机的,我怎么填写到agc中,所以这个方法不行。


更多关于HarmonyOS鸿蒙Next中如何实现元服务生成二维码并跳转指定页面?微信扫码是否可行?applinking不满足需求时的替代方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

AppLinking 是支持动态参数的,具体是怎么样操作的,动态参数生成二维码需要怎么样的规则呢,如果我现在在agc上生成了一个元服务链接https://hoas.drcn.agconnect.link/ZlE2W,动态参数是在这个后面加?然后在加参数,例如我加两个参数path和recordid:https://hoas.drcn.agconnect.link/ZlE2W?path=page/home?recordid=123456789,这样的操作,agc是不是不需要添加自定义参数,然后怎么扫码如果能打开元服务,如何解析参数数据。如果这个动态参数是要在agc上配置的话,那我要是每次生成二维码,那不都要去配置一次?我的需求是生成临时的二维码,生成二维码参数每次都不同的,别人扫码可以打开元服务可以获取参数

更多关于HarmonyOS鸿蒙Next中如何实现元服务生成二维码并跳转指定页面?微信扫码是否可行?applinking不满足需求时的替代方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


元服务链接是专为开发者设计的密文URL服务,它可以被用户点击并直达拉起元服务任意页面,实现元服务的点击触达,即点即用。作为开发者,您可以为自己的元服务生成并配置专属的元服务链接,同时设置其有效期,精准把握用户访问的时效与范围,以将用户在时效内引导至元服务任意指定页面。

可以使用AppLinking生成短链,通过短链生成二维码,然后扫码打开元服务并进入指定页面,详细配置请参考:使用App Linking跳转到元服务

AppLinking 是支持动态参数的:

文档地址:https://developer.huawei.com/consumer/cn/doc/atomic-guides/atomic-applinking#section48651523147

链接匹配规则组成部分:

  1. (必选)协议:仅支持http或https,精确匹配。
  2. (必选)域名:精确匹配。
  3. (可选)子路径:
    1. 如果链接匹配规则以/结尾,则匹配任意以该规则为前缀的子路径。
    2. 如果链接匹配规则不以/结尾,则不支持子路径匹配:
      1. {协议+域名+子路径}与链接匹配规则一致,匹配成功。
      2. {协议+域名+子路径}与链接匹配规则不一致时,匹配失败。
  4. (可选)动态参数:在URL中的?后,采用前缀匹配(即必须以链接匹配规则中配置的动态参数开始)。

鸿蒙Next中可通过@ohos.zcode模块生成二维码。使用createBarCodecreateQRCode方法生成图像,再通过router模块的pushUrl实现页面跳转。微信扫码无法直接跳转鸿蒙应用内部页面,需借助App Linking或自定义URL Scheme处理。App Linking不满足时,可考虑使用Deep Link技术结合自定义协议实现应用内路由。

在HarmonyOS Next中,实现元服务生成二维码并跳转指定页面,且AppLinking无法满足动态参数需求时,可以采用以下方案:

核心方案:使用自定义URL Scheme + 服务器动态生成二维码

  1. 配置元服务的自定义URL Scheme

    • 在元服务的module.json5配置文件中,为abilities添加skills配置,声明对特定Scheme的响应。
    • 示例配置:
      {
        "abilities": [
          {
            "name": "EntryAbility",
            "srcEntry": "./ets/entryability/EntryAbility.ts",
            "skills": [
              {
                "entities": ["entity.system.browsable"],
                "actions": ["action.system.view"],
                "uris": [
                  {
                    "scheme": "myapp", // 自定义Scheme,例如 myapp
                    "host": "open.page",
                    "path": "/*"
                  }
                ]
              }
            ]
          }
        ]
      }
      
  2. 在元服务中处理Scheme URL

    • EntryAbilityonCreateonNewWant生命周期回调中,通过want.uri获取启动参数。
    • 解析URL中的参数(如路径path和动态recordId),并导航到指定页面。
    • 示例代码片段(EntryAbility.ts):
      import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
      import { window } from '@kit.ArkUI';
      import { hilog } from '@kit.PerformanceAnalysisKit';
      import { router } from '@kit.ArkUI';
      
      export default class EntryAbility extends UIAbility {
        onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
          hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
          // 检查是否通过Scheme URL启动
          if (want.uri) {
            this.handleDeepLink(want.uri);
          }
        }
      
        onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
          // 应用已运行时,通过Scheme URL再次被唤醒
          if (want.uri) {
            this.handleDeepLink(want.uri);
          }
        }
      
        private handleDeepLink(uri: string) {
          // 示例:解析类似 myapp://open.page/pages/menu?recordId=1231515 的URL
          try {
            const urlObj = new URL(uri);
            const path = urlObj.pathname; // 例如 "/pages/menu"
            const params = new URLSearchParams(urlObj.search);
            const recordId = params.get('recordId'); // 例如 "1231515"
      
            // 将参数传递到UI,并跳转到指定页面
            // 假设使用router进行页面跳转,并传递参数
            router.pushUrl({
              url: path,
              params: { recordId: recordId }
            });
          } catch (error) {
            hilog.error(0x0000, 'testTag', 'Failed to parse deep link URI: %{public}s', error.message);
          }
        }
      }
      
  3. 动态生成二维码

    • 服务器端生成:推荐方案。构建一个后端服务,根据动态参数(如recordId)生成对应的URL(例如:myapp://open.page/pages/menu?recordId=动态值),并实时生成该URL的二维码图片。前端(元服务或其他应用)调用此接口获取二维码图片。
    • 客户端生成:如果动态参数在元服务内部产生且无需服务器参与,可以使用ArkUI的QRCode组件(@arkui.advanced.QRCode)在元服务内直接生成二维码。将动态URL字符串传入组件即可。
    • 生成二维码的URL格式示例:myapp://open.page/pages/menu?recordId=1231515

关于微信扫码

  • 微信内扫码通常不可行。微信浏览器或扫码功能对非HTTP/HTTPS的自定义Scheme(如myapp://)支持有限,通常会阻止直接跳转,或提示“在浏览器中打开”。
  • 系统或第三方扫码工具可行。大部分手机系统自带的相机扫码、或独立安装的扫码App(如华为“智慧视觉”扫码),在识别出自定义Scheme URL后,会询问用户是否在对应的元服务中打开。

AppLinking不满足时的替代方案总结

  1. 自定义URL Scheme:如上所述,是最直接、可控的方案,完美支持动态参数。缺点是跨平台(如微信)兼容性差。
  2. H5中转页(通用性强):
    • 生成一个带动态参数的HTTPS链接二维码(例如:https://your-domain.com/redirect?recordId=123)。
    • 用户用任何扫码工具(包括微信)扫描后,打开一个H5页面。
    • 该H5页面通过JavaScript检测运行环境:
      • 如果在HarmonyOS系统浏览器中,尝试通过window.location.href = 'myapp://...' 跳转元服务,并引导用户如果跳转失败则从应用市场下载。
      • 如果在微信内,可提示用户“点击右上角在浏览器中打开”。
    • 此方案兼容性最好,但实现稍复杂,需要部署H5页面。

结论与建议

  • 如果您的使用场景主要面向HarmonyOS设备,且用户大概率使用系统扫码首选自定义URL Scheme方案,实现简单,体验流畅。
  • 如果必须考虑微信扫码等广泛渠道,则需采用H5中转页方案作为补充。
  • 动态参数问题通过在URL的查询字符串(query string)中携带即可完美解决,无需依赖AppLinking的固定模板。
回到顶部