鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数
在鸿蒙生态中,元服务(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,内容如下:
{ "applinking": { "atomicServices": [ { "appIdentifier": "你的元服务标识" } ] } }
这个文件用于验证元服务所有权。注意:服务器可能默认禁止访问以.开头的路径,需手动配置Nginx等服务器开放.well-known目录的访问权限。
### 3. AGC后台配置
登录AGC(AppGallery Connect)后台,选择对应元服务,进入“基础服务-元服务链接”,创建元服务链接,配置链接规则和自定义参数。配置完成后,后台会显示链接生效状态。
### 4. 链接直达指定页面与参数传递
AppLinking支持打开元服务的指定页面,而非仅首页。通过ascfPara参数传递路径信息:
const value = `ascfPara=${encodeURIComponent('{"path":"/pages/tabBar/API/API"}')}`;
将编码后的参数填入AGC后台的自定义参数中,生成短链。扫码该短链即可直接打开指定页面。
### 5. 动态参数手动解析
鸿蒙不会自动将短链拼接的动态参数放入want中。需在元服务的EntryAbility中手动拦截onCreate生命周期,使用url.URL.parseURL解析URI,提取ascfPara参数并设置到want.parameters中:
import { AscfUIAbility } from '@atomicservice/ascfapi';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { url } from '@kit.ArkTS';
export default class EntryAbility extends AscfUIAbility {
onCreate(v: Want, w: AbilityConstant.LaunchParam): void {
let uri = v?.uri;
if (uri) {
try {
let urlObject = url.URL.parseURL(uri);
let ascfPara = urlObject.params.get('ascfPara');
v.parameters = { ascfPara: JSON.stringify(ascfPara) };
} catch (error) {
hilog.error(0x0000, 'testTag', 'Failed to parse url.');
}
}
super.onCreate(v, w);
}
}
这样后续UI层即可从参数中读取页面路径。
## 三、踩坑记录
1. **非同开发者账号无法唤起**:button方式唤起应用时,若目标应用与元服务不属于同一开发者账号,系统会直接拦截。系统应用(如日历)不受此限。
2. **.well-known路径必须可公开访问**:很多服务器默认屏蔽.开头的路径,需手动配置Nginx或Apache允许访问。
3. **参数获取需要延迟**:UTS插件中获取参数时通信通道未建立,建议使用setTimeout延迟处理或等待通道就绪事件。
4. **动态参数不会自动放入want**:通过短链拼接的参数需手动解析并设置到want.parameters中。
5. **元服务必须先上架**:AppLinking要求元服务已上架才能配置,开发阶段无法完整测试。
## 四、总结
选择哪种方式取决于场景:button唤起适用于内部跳转到同开发者账号应用或系统应用;AppLinking适用于通过外部链接、二维码等渠道引流到元服务指定页面。两种方式各有前置条件和限制,开发者需根据实际需求选择,并注意处理参数传递和权限验证。
Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数
感谢楼主的详细分享!这篇指导对鸿蒙元服务与应用的交互总结得非常清晰,特别是通过button组件和AppLinking两种方式唤起目标页面的场景区分,以及参数传递和踩坑点,对实际开发很有参考价值。 我正好在做一个元服务+主应用协同的项目,看到你提到的“UTS插件中参数获取需要延迟”这个坑,我们之前也踩过,后来改用setTimeout确实能解决。另外,关于AppLinking的ascfPara手动解析那段代码很实用,之前官方文档上这部分写得比较简略,你补充的示例直接就能用。 想问一下:在配置.well-known路径时,如果使用的是对象存储(比如OBS)而不是传统服务器,存放JSON文件有特殊注意事项吗?另外,动态参数手动解析后,是否支持携带多个自定义参数(比如同时传path和userId)?期待楼主的进一步经验。Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数
感谢楼主分享这么详细的开发指南,正好最近在折腾元服务唤起应用,参数延迟获取那个坑确实踩过,用setTimeout临时解决了。想请教一下,AppLinking的.well-known文件如果在本地开发环境下测试,有没有什么模拟的方式?还是说必须等元服务上架才能验证整个链路?Re: 鸿蒙元服务唤起应用与AppLinking开发指南:button组件与参数
非常感谢楼主的详细分享!正好在做元服务相关的开发,这篇文章帮了大忙。关于参数获取延迟的问题,之前一直没找到合适的方法,没想到用setTimeout就能解决,回头试试。另外想请教一下,如果元服务唤起的是第三方应用(非同开发者账号),除了系统应用外,有没有其他变通的办法?期待楼主的后续经验。
页:
[1]