HarmonyOS应用间跳转开发指南
在移动生态中,用户常常需要跨多个应用完成一次完整任务(例如“浏览-下单-支付-分享”)。如果每一步都要手动切换应用,体验将被频繁中断。系统提供的“应用间跳转能力”通过统一的链接协议和系统级路由,实现“一键直达”的流畅体验,显著提升用户效率和满意度,从而提升应用转化率与用户留存率。
1 典型业务场景
社交分享
广告跳转
特殊文本跳转
Web与应用跳转
技术实现方案
系统主要提供应用链接的实现方式:
·App Linking:通过域名校验和HTTPS协议,实现更安全可靠的跳转。
·Deep Linking:实现相对简单,但存在被恶意仿冒的风险。
2 Deep Linking & App Linking
1)按照应用链接的scheme以及校验机制的不同,可以分为Deep Linking与App Linking两种形式。
Deep Linking:是一种通过链接跳转至应用特定页面的技术,其特点是支持开发者定义任意形式的scheme。由于缺乏域名校验机制,容易被其他应用所仿冒。
App Linking:必须在AGC开通App Linking服务,其限定了scheme必须为https,同时通过增加域名校验机制,防止应用仿冒,直达受信的目标应用。
|
App Linking |
Deep Linking |
实现方案 |
目标应用需要在module.json5中声明应用链接;同时需要向系统注册域名并通过域名认证。 |
目标应用需要在module.json5中声明应用链接; |
链接格式 |
scheme必须是https |
scheme可以自定义 |
是否可以直接拉起应用 |
可以 |
可以,但有被仿冒的风险 |
2)接入方式
Deep Linking:在module.json5中配置skills标签
注意,scheme取值不以"ohos"开头。通常不为"https"、"http"、"file"等已被系统应用使用的值,否则会匹配到对应的系统应用。
{
"module": {
// ...
"abilities": [
{
// ...
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"ohos.want.action.home"
]
},
{
"actions": [
// actions不能为空,actions为空会造成目标方匹配失败。
"ohos.want.action.viewData"
],
"uris": [
{
// scheme必选,可以自定义,以link为例,需要替换为实际的scheme
"scheme": "link",
// host必选,配置待匹配的域名
"host": "www.example.com"
}
]
} // 新增一个skill对象,用于跳转场景。如果存在多个跳转场景,需配置多个skill对象。
]
}
]
}
}
App Linking:
1.在AGC开通App Linking服务
2.在开发者自己的域名服务器上增加配置文件applinking.json(默认文件名)
{
"applinking": {
"apps": [
{
"appIdentifier": "APP ID"
}
]
}
}
·appIdentifier填写创建应用时生成的APP ID。
·同一个网站域名可以关联多个应用,只需要在"apps"列表里放置多个"appIdentifier"元素即可,其中每个"appIdentifier"元素对应每个应用。
然后将配置文件放在域名服务器的固定目录下:
https://domain.name/.well-known/applinking.json
例如:开发者的服务器域名为www.example.com,则必须将applinking.json文件放在如下位置:https://www.example.com/.well-known/applinking.json
3.在AGC创建关联的网址域名
设置完成后点击“发布”,AGC会对该网站域名的配置文件所包含的应用与本项目内的应用列表进行交集校验。
如果域名的配置文件中有应用存在本项目中,则发布成功,点击“查看”可显示该域名关联的应用信息。
4.应用的module.json5配置
例如,声明应用关联的域名是www.example.com,则需进行如下配置。
{
“module”:{
“abilities”:[
{ //…Ability配置代码省略
//请将exported配置为true;如果exported为false,仅具有权限的系统应用
//拉起该应用,否则无法拉起应用
exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"ohos.want.action.home"
]
},
{
"entities": [
// entities必须包含"entity.system.browsable"
"entity.system.browsable"
],
"actions": [
// actions必须包含"ohos.want.action.viewData"
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "https",
"host": "www.example.com",
// path可选,表示域名服务器上的目录或文件路径,例如
// www.example.com/path1中的path1
// 如果应用只能处理部分特定的path,则此处应该配置应用所支持
//的path避免出现应用不能处理的path链接也被引流到应用中的问题
"path": "path1"
}
],
// domainVerify须设置为true
"domainVerify": true
}
// 若有其他跳转能力,如推送消息跳转、NFC跳转,可新增一个skill对
// 象,防止与App Linking业务冲突
]
}
]
}
}
5、如何确认域名配置是否成功?
如需查看应用域名验证结果,请在DevEco Studio中打开终端,并使用以下命令查询验证结果:
hdc shell hidumper -s AppDomainVerifyManager
运行hidumper命令后,即可在控制台上看到success消息。
BundleName:
appIdentifier:123456789
domain verify status:
https://www.example.com:success
3 常见场景:应用内跳转其他应用
1.调用方通过openLink接口启动目标应用,传入的link可以是Deep Linking或App Linking;
2.调用方如果只想拉起App Linking,可以调用时把appLinkingOnly置为true;
let context = GlobalContext.getContext();
let link: string = "https://www.example.com/programs?action=showall";
// 仅以App Linking的方式打开应用
context.openLink(link, { appLinkingOnly: true })
.then(() => {
hilog.info(0x0000, 'testTag', `Succeeded in opening link.`);
})
.catch((error: BusinessError) => {
hilog.error(0x0000, 'testTag', `Failed to open link, code: ${error.code}, message:
${error.message}`);
})
4 常见场景:Web页面跳转其他应用
1.在拦截回调onLoadIntercept中实现跳转
-
Web({ src: $rawfile('index2.html'), controller: this.controller }) .zoomAccess(false) .onLoadIntercept((event) => { /判断链接是否指向第三方 If (url === 'third-party://pages/toThirdApp'){ const link: string = "appScheme://www.test.com:80/path1"; this.context.openLink(link, openLinkOptions) } })
-
-
2.在前端通过绑定事件window.open或超链接实现
<script> window.open(‘https://www.example.com/programs’)</script>
<a class="function_item" href=" https://www.example.com/programs">跳转链接</a>
注意:在浏览器地址栏输入App Linking或Deep Linking打开应用,只能通过网页内的跳转代码实现(a标签、window.open()、window.location.href等)
解决方案:写一个h5页面作为中转,在h5页面中通过link拉起App。
5 常见场景:应用未安装拉起应用市场
拉起应用市场几种常见场景:
1.不管应用是否安装,只拉应用市场详情页
1)构建应用市场的link;
2)通过openLink接口拉起应用市场
let context: common.UIAbilityContext =
this.getUIContext().getHostContext() as common.UIAbilityContext;
// 需要拼接不同的应用包名,用以打开不同的应用详情页,例如:bundleName: 'com.huawei.hmsapp.books'
let bundleName: string = 'xxxx';
let link: string = 'https://appgallery.huawei.com/app/detail?id=' + bundleName +
‘tion=write-review ‘
// 以App Linking优先的方式在应用市场打开指定包名的应用详情页
context.openLink(link, { appLinkingOnly: false })
.then(() => {
hilog.info(0x0001, 'TAG', 'openlink success.');
})
.catch((error: BusinessError) => {
});
2.只在应用未安装时拉起应用市场
1)需要目标应用接入App Linking,并且配置直达应用市场;
2)调用方在调用openLink时,传入目标应用App Linking, appLinkingOnly设置为false。
6 常见场景:跳转系统链接
跳转设置、应用市场、联系人、电话、日历等系统应用时,系统封装了单独的Kit。可以直接调用相关Kit的接口进行跳转。
应用市场:Store Kit
钱包:Payment Kit
日历:Calendar Kit
联系人:Contacts Kit
相机:
拍照录像:Camera Kit
扫码 :Scan Kit
卡证识别:Vision Kit
文档扫描 :Vision Kit
7 常见三方应用链接
应用名 |
scheme |
示例 |
抖音 |
snssdk1128 |
snssdk1128://home |
微博 |
sinaweibo |
sinaweibo://home |
小红书 |
xhsdiscover |
xhsdiscover://home |
哔哩哔哩 |
bilibili |
bilibili://home |
快手 |
kwai |
kwai://home |
微信 |
weixin |
weixin://home |
|
mqqapi |
mqqapi://home |
支付宝 |
alipays |
alipays://home |
云闪付 |
upwallet |
upwallet://home |
京东 |
openapp.jdmobile |
openapp.jdmobile://home |
美团 |
imeituan |
imeituan://home |
拼多多 |
pinduoduo |
pinduoduo://home |
淘宝 |
tbopen |
tbopen://home |
高德地图 |
amapuri |
amapuri://home |
腾讯会议 |
wemeet |
wemeet://home |
更多推荐
所有评论(0)