查看: 90|回复: 3

鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在鸿蒙生态中,元服务(Atomic Service)作为一种轻量级免安装应用,常需要与完整鸿蒙应用协同工作。通过uni-app框架开发元服务时,开发者面临两个核心场景:从元服务内部唤起同开发者的鸿蒙应用,以及通过外部链接或二维码从元服务外部唤起元服务特定页面。本文将基于实际开发经验,解析这两种实现方式的技术细节、参数传递方法及常见踩坑点。

## 一、元服务内唤起鸿蒙应用

### 1. 唤起系统应用

元服务可以通过button组件的open-type="launchApp"属性直接打开系统内置应用。例如,打开日历应用时,需指定以下属性:
- app-bundle-name:目标应用的包名,如com.huawei.hmos.calendar
- app-ability-name:目标Ability名称,如MainAbility

这种方式无需额外权限,元服务可直接唤起系统应用。

### 2. 唤起同开发者账号下的鸿蒙应用

若目标应用与元服务属于同一个开发者账号,同样使用open-type="launchApp",但需额外指定app-module-name和app-parameters参数。注意:鸿蒙系统限制只能唤起相同开发者账号下的应用,非同账号应用会被拦截。

参数传递:通过app-parameters可以给目标应用传递自定义数据,例如{from:"as"}。在目标应用的UTS插件中,需监听onAppAbilityCreate和onAppAbilityNewWant生命周期,从want.parameters中读取传递的参数。注意:通信通道尚未完全建立时获取参数可能为空,建议使用setTimeout延迟一秒后再读取。

## 二、AppLinking:外部唤起元服务

AppLinking是鸿蒙提供的通过链接、二维码等方式从外部唤起元服务的能力。

### 1. 前置条件
- 开发者账号必须是企业账号(个人账号不支持)。
- 元服务必须已上架(未上架无法配置AppLinking)。

### 2. 配置.well-known路径

需在服务端部署一个JSON文件,路径为.well-known/applinking.json,内容如下:
  1. { "applinking": { "atomicServices": [ { "appIdentifier": "你的元服务标识" } ] } }
复制代码
这个文件用于验证元服务所有权。注意:服务器可能默认禁止访问以.开头的路径,需手动配置Nginx等服务器开放.well-known目录的访问权限。

### 3. AGC后台配置

登录AGC(AppGallery Connect)后台,选择对应元服务,进入“基础服务-元服务链接”,创建元服务链接,配置链接规则和自定义参数。配置完成后,后台会显示链接生效状态。

### 4. 链接直达指定页面与参数传递

AppLinking支持打开元服务的指定页面,而非仅首页。通过ascfPara参数传递路径信息:
  1. const value = `ascfPara=${encodeURIComponent('{"path":"/pages/tabBar/API/API"}')}`;
复制代码
将编码后的参数填入AGC后台的自定义参数中,生成短链。扫码该短链即可直接打开指定页面。

### 5. 动态参数手动解析

鸿蒙不会自动将短链拼接的动态参数放入want中。需在元服务的EntryAbility中手动拦截onCreate生命周期,使用url.URL.parseURL解析URI,提取ascfPara参数并设置到want.parameters中:
  1. import { AscfUIAbility } from '@atomicservice/ascfapi';
  2. import AbilityConstant from '@ohos.app.ability.AbilityConstant';
  3. import Want from '@ohos.app.ability.Want';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. import { url } from '@kit.ArkTS';
  6. export default class EntryAbility extends AscfUIAbility {
  7.     onCreate(v: Want, w: AbilityConstant.LaunchParam): void {
  8.         let uri = v?.uri;
  9.         if (uri) {
  10.             try {
  11.                 let urlObject = url.URL.parseURL(uri);
  12.                 let ascfPara = urlObject.params.get('ascfPara');
  13.                 v.parameters = { ascfPara: JSON.stringify(ascfPara) };
  14.             } catch (error) {
  15.                 hilog.error(0x0000, 'testTag', 'Failed to parse url.');
  16.             }
  17.         }
  18.         super.onCreate(v, w);
  19.     }
  20. }
复制代码
这样后续UI层即可从参数中读取页面路径。

## 三、踩坑记录

1. **非同开发者账号无法唤起**:button方式唤起应用时,若目标应用与元服务不属于同一开发者账号,系统会直接拦截。系统应用(如日历)不受此限。
2. **.well-known路径必须可公开访问**:很多服务器默认屏蔽.开头的路径,需手动配置Nginx或Apache允许访问。
3. **参数获取需要延迟**:UTS插件中获取参数时通信通道未建立,建议使用setTimeout延迟处理或等待通道就绪事件。
4. **动态参数不会自动放入want**:通过短链拼接的参数需手动解析并设置到want.parameters中。
5. **元服务必须先上架**:AppLinking要求元服务已上架才能配置,开发阶段无法完整测试。

## 四、总结

选择哪种方式取决于场景:button唤起适用于内部跳转到同开发者账号应用或系统应用;AppLinking适用于通过外部链接、二维码等渠道引流到元服务指定页面。两种方式各有前置条件和限制,开发者需根据实际需求选择,并注意处理参数传递和权限验证。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数

感谢楼主的详细分享!这篇指导对鸿蒙元服务与应用的交互总结得非常清晰,特别是通过button组件和AppLinking两种方式唤起目标页面的场景区分,以及参数传递和踩坑点,对实际开发很有参考价值。 我正好在做一个元服务+主应用协同的项目,看到你提到的“UTS插件中参数获取需要延迟”这个坑,我们之前也踩过,后来改用setTimeout确实能解决。另外,关于AppLinking的ascfPara手动解析那段代码很实用,之前官方文档上这部分写得比较简略,你补充的示例直接就能用。 想问一下:在配置.well-known路径时,如果使用的是对象存储(比如OBS)而不是传统服务器,存放JSON文件有特殊注意事项吗?另外,动态参数手动解析后,是否支持携带多个自定义参数(比如同时传path和userId)?期待楼主的进一步经验。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数

感谢楼主分享这么详细的开发指南,正好最近在折腾元服务唤起应用,参数延迟获取那个坑确实踩过,用setTimeout临时解决了。想请教一下,AppLinking的.well-known文件如果在本地开发环境下测试,有没有什么模拟的方式?还是说必须等元服务上架才能验证整个链路?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数

非常感谢楼主的详细分享!正好在做元服务相关的开发,这篇文章帮了大忙。关于参数获取延迟的问题,之前一直没找到合适的方法,没想到用setTimeout就能解决,回头试试。另外想请教一下,如果元服务唤起的是第三方应用(非同开发者账号),除了系统应用外,有没有其他变通的办法?期待楼主的后续经验。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 20:52 , Processed in 0.024012 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部