鸿蒙Harmony开发实战(5.0 Beta)App Linking实现应用间跳转规范详解
鸿蒙开发往期必看:一分钟相识”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零底子入门到精通)
“一杯冰美式的时间” 相识鸿蒙HarmonyOS Next应用开发路径!
简介
使用App Linking进行跳转时,体系会根据接口传入的uri信息(HTTPS链接)将用户引导至目标应用中的特定内容,无论应用是否已安装,用户都可以访问到链接对应的内容,整个跳转体验相比Deep Linking方式更加顺畅。
适用场景
[*] 适用于对安全性要求较高的场景,制止出现目标应用被别的应用仿冒的问题。
[*] 适用于对体验要求较高的场景,不管目标应用是否安装,用户点击该链接都可以正常访问。
实现原理
[*] App Linking在Deep Linking底子上增长了域名校验环节,通过域名校验,可帮助用户消除歧义,识别正当归属于域名的应用,使链接更加安全可靠。
[*] App Linking要求对于同一HTTPS网址,有应用和网页两种内容的呈现方式。当应用安装时则优先打开应用去呈现内容;当应用未安装时,则打开浏览器呈现Web版的内容。
目标应用操纵指导
目标应用如需支持App Linking功能,需要执行如下操纵:
[*]声明应用关联的网站域名。
[*]在开发者网站上关联应用。
[*]添加代码到应用的Ability中,以处理传入的链接。
声明应用关联的网站域名
在应用的module.json5配置文件中进行如下配置,以声明应用关联的域名地址,并开启域名校验开关。
[*]“actions"列表中包含"ohos.want.action.viewData”。
[*]“entities"列表中包含"entity.system.browsable”。
[*]"uris"列表中包含"scheme"为"https"且"host"为域名地址的元素。
[*]“domainVerify”:设置为true,表示开启域名校验开关。
比方,声明应用关联在域名是www.example.com,则需进行如下配置:
{
"module": {
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"icon": "$media:icon",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"skills": [
{
"entities": [
// entities须包含"entity.system.browsable"
"entity.system.browsable"
],
"actions": [
// actions须包含"ohos.want.action.viewData"
"ohos.want.action.viewData"
],
"uris": [
{
// scheme须配置为https
"scheme": "https",
// host须配置关联的域名
"host": "www.example.com",
// port可选
"port": "443",
// path可选,为了避免匹配到多个应用,建议配置该字段
"path": "path1"
}
],
// domainVerify须设置为true
"domainVerify": true
}
]
}
]
}
}
在开发者网站上关联应用
在开发者的网站上做如下配置,以关联应用。
[*] 创建域名配置文件applinking.json。
内容为如下:
{
"applinking": {
"apps": [
{
"appIdentifier": "1234"
}
]
},
}
app-identifer是在应用签名阶段为应用分配的唯一标识,即HarmonyAppProvision配置文件中声明的app-identifer字段的值。
[*] 将配置文件放在域名服务器的固定目录下。 固定目录为:
https://your.domain.name/.well-known/applinking.json
比方开发者的域名为www.example.com,则需将applinking.json文件放在如下位置: https://www.example.com/.well-known/applinking.json
添加代码到应用的Ability中以处理传入的链接
在应用的Ability(如EntryAbility)的onCreate()大概onNewWant()生命周期回调中添加代码,以处理传入的链接。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { url } from '@kit.ArkTS';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 从want中获取传入的链接信息。
// 如传入的url为:https://www.example.com/programs?action=showall
let uri = want?.uri
if (uri) {
// 从链接中解析query参数,拿到参数后,开发者可根据自己的的务需求进行后续的处理。
let urlObject = url.URL.parseURL(want?.uri);
let action = urlObject.params.get('action')
// 例如,当action为showall时,展示所有的节目。
if (action === "showall"){
...
}
...
}
}
}
拉起方应用实现应用跳转
拉起方应用通过UIAbilityContext.openLink接口,传入目标应用的链接,拉起目标应用。
openLink接口提供了两种拉起目标应用的方式,开发者可根据业务需求进行选择。
[*] 方式一: 仅以App Linking的方式打开应用 将appLinkingOnly参数设为true,若有匹配的应用,则直接打开目标应用。若无App Linking匹配的应用,则抛非常给开发者进行处理。
[*] 方式二: 以App Linking优先的方式打开应用 将appLinkingOnly参数设为false大概默认,则为App Linking优先的方式打开应用。若有App Linking匹配的应用,则直接打开目标应用。若无App Linking匹配的应用,则实行以Deep Linking的方式打开应用。
本文为了方便验证App Linking的配置是否精确,选择方式一,示比方下。
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
build() {
Button('start link', { type: ButtonType.Capsule, stateEffect: true })
.width('87%')
.height('5%')
.margin({ bottom: '12vp' })
.onClick(() => {
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
let link: string = "https://www.example.com/programs?action=showall";
// 仅以App Linking的方式打开应用
context.openLink(link, { appLinkingOnly: true })
.then(() => {
console.info('openlink success.');
})
.catch((error: BusinessError) => {
console.error(`openlink failed. error:${JSON.stringify(error)}`);
});
})
}
}
在拉起方应用中执行上述代码,如果可以或许成功拉起目标应用,表明目标应的App Linking配置精确。
FAQ
[*] 应用的Modules.json5文件skills设置不精确。
检查"host"字段中是否是应用所对应的域名。
[*] 开发者网站服务器配置不精确。
[*]检查服务器的 JSON 配置,并确保 appIdentifier 的值精确无误。
[*]检查applinking.json是否放置在精确的目录(.well-known)下,通过浏览器等方式访问该json文件的地址:https://your.domain.name/.well-known/applinking.json,确保能正常访问。
[*] 体系尚未完成域名校验。
在装备上安装应用,需等待至少20秒,确保异步验证流程完成。
[*] 应用和域名的对应关系是怎样的?
应用和域名的关系是多对多的关系:一个应用可以关联多个不同的域名,同样的,一个域名也可以关联多个不同的应用。
[*] 如果同一域名关联了多个应用,那么该域名的链接将拉起哪个应用呢?
开发者可以通过配置applinking.json以关联多个应用。如果每个应用的module.json5的uris字段配置的都是一样的,那么体系将弹出列表框供用户选择要拉起的目标应用。 为了更好的体验,开发者也可以通过链接的path去区分拉起的目标应用,如链接https://www.example.com/path1拉起目标应用1,链接https://www.example.com/path2拉起目标应用2。
末了
小编在之前的鸿蒙体系扫盲中,我显着感觉到一点,那就是许多人到场鸿蒙开发,但是又不知道从那里下手,有许多小同伴不知道学习哪些鸿蒙开发技能?不知道需要重点把握哪些鸿蒙应用开发知识点?而且学习时频仍踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、文档、视频、用来跟着学习是非常有必要的。
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员
→ 鸿蒙全栈开发学习条记 希望这一份鸿蒙学习文档可以或许给大家带来帮助~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]