本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。
Deep Linking 是一种基于 URL 链接的应用间跳转方式,它允许开发者定义任意形式的 scheme,实现灵活的应用间跳转。Deep Linking 适用于各种场景,例如应用内页面跳转、外部链接跳转等。
Deep Linking 简介
Deep Linking 是一种基于 URL 链接的应用间跳转方式,它允许开发者定义任意形式的 scheme,实现灵活的应用间跳转。Deep Linking 的特点如下:
- 自定义 scheme:可以定义任意不包含特殊字符、非 ohos 开头的字符串,例如 "geo"、"weather" 等。
- 支持自定义参数:可以在 URL 中添加自定义参数,传递数据给目标应用。
- 无需域名校验:没有域名校验机制,容易被其他应用仿冒。
Deep Linking 的实现原理
Deep Linking 的实现原理如下:
- 目标应用在配置文件中注册 URL skill:目标应用需要在配置文件中声明它支持的 URL scheme、host 和 path 等信息,这样系统才能识别它。
- 拉起方应用在跳转接口中传入目标应用的 URL:拉起方应用需要构建一个符合目标应用 URL skill 格式的链接,并传入相应的跳转接口。
- 系统根据 URL 匹配目标应用并跳转:系统会根据 URL 中的 scheme、host 和 path 等信息,在已安装的应用中查找匹配项,并跳转到目标应用内的对应页面。
目标应用在配置文件中注册 URL skill
目标应用需要在 module.json5
配置文件的 skills
标签下注册 URL skill,声明它支持的 URL scheme、host 和 path 等信息。例如:
{
"module": {
"abilities": [
{
"skills": [
{
"uris": [
{
"scheme": "geo",
"host": "example.com",
"path": "path1"
}
]
}
]
}
]
}
}
URL skill 参数说明
参数 | 类型 | 说明 |
---|---|---|
scheme | string | URL 协议名称,例如 "geo"、"weather" 等 |
host | string | URL 域名或 IP 地址 |
port | string | URL 端口号 |
path | string | URL 路径 |
pathStartWith | string | URL 路径前缀 |
pathRegex | string | URL 路径正则表达式 |
linkFeature | string | 应用的功能类型,例如 "FileOpen"、"Navigation" 等 |
拉起方应用实现应用跳转
1. 使用 openLink 接口
openLink
接口可以用于打开 Deep Linking 链接,并设置选项参数,例如 appLinkingOnly
和 parameters
等。
示例代码:
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const link: string = "geo:37.7749,-122.4194"; // 地点坐标
const options: common.OpenLinkOptions = {
appLinkingOnly: false // 允许使用 Deep Linking 跳转
};
context.openLink(link, options);
}
}
2. 使用 startAbility 接口
startAbility
接口可以用于打开 Deep Linking 链接,并设置选项参数,例如 abilityName
和 moduleName
等。
示例代码:
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const want: common.Want = {
action: 'ohos.want.action.viewData',
uri: "geo:37.7749,-122.4194",
entities: ["entity.system.browsable"],
actions: ["ohos.want.action.viewData"]
};
context.startAbility(want);
}
}
3. 使用 Web 组件
Web 组件可以通过拦截 onLoadIntercept
回调来处理 Deep Linking 链接,实现应用跳转。
示例代码:
import { webview } from '@ohos.arkweb';
export default class WebComponent {
controller: webview.WebviewController = new webview.WebviewController();
build() {
this.controller.onLoadIntercept((event) => {
const url: string = event.data.getRequestUrl();
if (url.startsWith("geo:")) {
// 跳转到地图应用
}
return true; // 阻止页面加载
});
}
}
举(N)个栗子
示例 1:Deep Linking 接入示例
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const want: common.Want = {
action: 'ohos.want.action.viewData',
uri: "geo:37.7749,-122.4194",
entities: ["entity.system.browsable"],
actions: ["ohos.want.action.viewData"]
};
context.startAbility(want);
}
}
示例 2:Deep Linking 跳转示例
import { common } from '@ohos.app.ability.common';
import { url } from '@ohos.arkts';
export default class EntryAbility extends common.UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
const uri = want?.uri;
if (uri) {
const urlObject = url.URL.parseURL(want.uri);
const action = urlObject.params.get('action');
if (action === "showall") {
// 跳转到应用内的“所有节目”页面
}
}
}
}
总结:
使用 Deep Linking 实现应用间跳转是一种灵活的方式,它允许开发者定义任意形式的链接规则,实现个性化的应用间跳转。实际开发中需要按照步骤配置 Deep Linking 接入,并在目标应用中处理传入的链接,才能实现 Deep Linking 功能。