本节主要介绍如何通过应用链接跳转的方式拉起指定应用。
应用链接
应用链接是指可以将用户引导至应用内特定位置或相关网页的URL,常见的格式如下。
scheme://host[:port]/path
应用链接运作机制如下。
- 目标应用在配置文件中注册自己的URL,并对外提供URL。
- 拉起方应用在跳转接口中传入目标应用的URL等信息。
- 系统接收到URL等相关信息,会寻找对应匹配项,并跳转至目标应用。
应用链接分类
按照应用链接的scheme以及校验机制的不同,可以分为Deep Linking与App Linking两种方式。
- Deep Linking:是一种通过链接跳转至应用特定页面的技术,其特点是支持开发者定义任意形式的scheme。由于缺乏域名校验机制,容易被其他应用所仿冒。
- App Linking:其限定了scheme必须为https,同时通过增加域名校验机制,可以从已匹配到的应用中筛选过滤出目标应用,消除应用查询和定位中产生的歧义,直达受信的目标应用。
拉起指定应用
接下来演示如何通过应用链接跳转的方式拉起指定应用。
1. 创建目标应用
创建名为“ArkTSDeepLinkingTarget”的目标应用。目标应用是被拉起的应用。
修改index.ets内容如下:
@Entry @Component struct Index { @State message: string = '目标应用'; build() { RelativeContainer() { Text(this.message) .id('HelloWorld') .fontSize($r('app.float.page_text_font_size')) .fontWeight(FontWeight.Bold) .alignRules({ center: { anchor: '__container__', align: VerticalAlign.Center }, middle: { anchor: '__container__', align: HorizontalAlign.Center } }) } .height('100%') .width('100%') } }
2. 创配置目标应用module.json5文件
为了能够支持被其他应用访问,目标应用需要在module.json5配置文件中配置skills标签。
skills标签下默认包含一个skill对象,用于标识应用入口。应用跳转链接不能在该skill对象中配置,需要创建独立的skill对象。如果存在多个跳转场景,需要在skills标签下创建不同的skill对象,否则会导致配置无法生效。
Deep Linking中的scheme取值支持自定义,可以为任意不包含特殊字符、非ohos开头的字符串。通常不为https、http、file,否则会拉起默认的系统浏览器。
配置如下:
{ "module": { // ...省略非核心内容 "abilities": [ { // ...省略非核心内容 "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] }, // 新增一个skill对象,用于跳转场景。如果存在多个跳转场景,需配置多个skill对象 { "actions": [ // actions不能为空,actions为空会造成目标方匹配失败。 "ohos.want.action.viewData" ], "uris": [ { // scheme必选,可以自定义,以link为例,需要替换为实际的scheme "scheme": "link", // host必选,配置待匹配的域名 "host": "waylau.com" } ] } ] } ], // ...省略非核心内容 } }
3. 创建拉起应用
创建名为“ArkTSDeepLinkingStartup”的拉起应用。拉起应用的作用是为了拉起目标应用。
修改index.ets内容如下:
import { common, OpenLinkOptions } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; const TAG: string = '[ArkTSDeepLinkingStartup]'; const DOMAIN_NUMBER: number = 0xFF00; @Entry @Component struct Index { @State message: string = '启动目标应用'; build() { RelativeContainer() { Text(this.message) .id('HelloWorld') .fontSize($r('app.float.page_text_font_size')) .fontWeight(FontWeight.Bold) .alignRules({ center: { anchor: '__container__', align: VerticalAlign.Center }, middle: { anchor: '__container__', align: HorizontalAlign.Center } }) .onClick(() => { let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; let link: string = "link://waylau.com"; let openLinkOptions: OpenLinkOptions = { //跳转目标应用(如果有多个符合条件的应用时,展示应用选择弹框) appLinkingOnly: false }; 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}`); } }) } .height('100%') .width('100%') } }
在上述代码中,在openLink接口的link字段中传入目标应用的URL信息,并将options字段中的appLinkingOnly配置为false。
4. 运行应用
在虚拟机上先运行目标应用以后,而后将应用关闭,如图所示。这样就确保目标应用已经在模拟机上安装了。
其次,运行拉起应用,如图所示。点击拉起应用的文本以触发启动目标应用事件。
拉起应用的效果如下图所示。
参考引用
更多示例源码、HarmonyOS学习资料可见
- 《跟老卫学HarmonyOS开发》 开源免费教程,https://github.com/waylau/harmonyos-tutorial
- 《鸿蒙HarmonyOS手机应用开发实战》(清华大学出版社)
- 《鸿蒙HarmonyOS应用开发从入门到精通战》(北京大学出版社)
- 《鸿蒙HarmonyOS应用开发入门》(清华大学出版社)
- “鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”(https://coding.imooc.com/class/674.html)
- “鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”(https://coding.imooc.com/class/843.html)