采用Deep Linking举行跳转时,系统会根据接口中传入的uri信息,在本地已安装的应用中寻找到符合条件的应用并举行拉起。当匹配到多个应用时,会拉起应用选择框。
实现原理
Deep Linking基于隐式Want匹配机制中的uri匹配来查询、拉起目标应用。
目标应用配置module.json5文件
为了能够支持被其他应用访问,目标应用必要在[module.json5配置文件]中配置[skills标签]。其中,uri字段的scheme的取值支持自界说,可以界说为恣意不包罗特别字符、非ohos开头的字符串。
分析:
Deep Linking中的scheme取值通常不为https、http、file,否则会拉起默认的系统浏览器。
配置示例如下:
- {
- "module": {
- // ...
- "abilities": [
- {
- // ...
- "skills": [
- {
- "actions": [
- // actions不能为空,actions为空会造成目标方匹配失败
- "ohos.want.action.viewData"
- ],
- "uris": [
- {
- // scheme必选,可以自定义,以link为例,需要替换为实际的scheme
- "scheme": "link",
- // host必选,配置待匹配的域名
- "host": "www.example.com"
- }
- ]
- }
- ]
- }
- ]
- }
- }
复制代码 拉起方应用实现应用跳转
下面通过三个案例,分别介绍怎样使用[openLink()]与[startAbility()]接口实现应用跳转,以及怎样在[Web组件]中实现应用跳转。
使用openLink实现应用跳转
在[openLink]接口的link字段中传入目标应用的URL信息,并将options字段中的appLinkingOnly配置为false。
示例代码如下:
- import { common, OpenLinkOptions } from '@kit.AbilityKit';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { hilog } from '@kit.PerformanceAnalysisKit';
- const TAG: string = '[UIAbilityComponentsOpenLink]';
- const DOMAIN_NUMBER: number = 0xFF00;
- @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 = "link://www.example.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}`);
- }
- })
- }
- }
复制代码 使用startAbility实现应用跳转
[startAbility]接口是将应用链接放入want中,通过调用[隐式want匹配]的方法触发应用跳转。通过[startAbility]接口启动时,还必要调用方传入待匹配的action和entity。
示例代码如下:
- import { common, Want } from '@kit.AbilityKit';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { hilog } from '@kit.PerformanceAnalysisKit';
- const TAG: string = '[UIAbilityComponentsOpenLink]';
- const DOMAIN_NUMBER: number = 0xFF00;
- @Entry
- @Component
- struct Index {
- build() {
- Button('start ability', { type: ButtonType.Capsule, stateEffect: true })
- .width('87%')
- .height('5%')
- .margin({ bottom: '12vp' })
- .onClick(() => {
- let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
- let want: Want = {
- uri: "link://www.example.com"
- };
- try {
- context.startAbility(want).then(() => {
- hilog.info(DOMAIN_NUMBER, TAG, 'start ability success.');
- }).catch((err: BusinessError) => {
- hilog.error(DOMAIN_NUMBER, TAG, `start ability failed. Code is ${err.code}, message is ${err.message}`);
- });
- } catch (paramError) {
- hilog.error(DOMAIN_NUMBER, TAG, `Failed to start ability. Code is ${paramError.code}, message is ${paramError.message}`);
- }
- })
- }
- }
复制代码 使用Web组件实现应用跳转
Web组件必要跳转DeepLink链接应用时,可通过拦截回调[onLoadIntercept]中对界说的事件举行处置惩罚,实现应用跳转。
示例代码如下:
- // index.ets
- import { webview } from '@kit.ArkWeb';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { common } from '@kit.AbilityKit';
- @Entry
- @Component
- struct WebComponent {
- controller: webview.WebviewController = new webview.WebviewController();
- build() {
- Column() {
- Web({ src: $rawfile('index.html'), controller: this.controller })
- .onLoadIntercept((event) => {
- const url: string = event.data.getRequestUrl();
- if (url === 'link://www.example.com') {
- (getContext() as common.UIAbilityContext).openLink(url)
- .then(() => {
- console.log('openLink success');
- }).catch((err: BusinessError) => {
- console.error('openLink failed, err:' + JSON.stringify(err));
- });
- return true;
- }
- // 返回true表示阻止此次加载,否则允许此次加载
- return false;
- })
- }
- }
- }
复制代码 前端页面代码:
- // index.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- </head>
- <body>
- <h1>Hello World</h1>
- <!--方式一、通过绑定事件window.open方法实现跳转-->
- <button class="doOpenLink" onclick="doOpenLink()">跳转其他应用一</button>
- <!--方式二、通过超链接实现跳转-->
- <a href="link://www.example.com">跳转其他应用二</a>
- </body>
- </html>
- <script>
- function doOpenLink() {
- window.open("link://www.example.com")
- }
- </script>
复制代码 到这里我们就基本上学完一个简单的技能,当然假如说要真正参与到鸿蒙的开发当中,要学的还有很多。各人可以看看下面这个鸿蒙入门到实战的学习技能路线图:
而随着鸿蒙的火热,现阶段已有许多Android、前端等开发者看中其未来趋势;想从网上查阅学习,但搜刮到的鸿蒙资料都是七零八碎的,对此为了避免各人在学习过程中浪费过多时间,特地根据鸿蒙官方发布文档联合华为内部职员的分享,颠末反复修改整理得出:
整套鸿蒙(HarmonyOS NEXT)笔记(共计1236页)与鸿蒙(HarmonyOS NEXT)开发入门&实战视频(200集+)。
内容包罗了:(ArkTS、ArkUI、Stage模子、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技能、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技能知识点。《鸿蒙 (HarmonyOS NEXT)开发入门文件&实战视频》←全部嗱到资助各人在学习鸿蒙路上少走弯路!
现在的鸿蒙生态建设非常迅速;就目前,鸿蒙生态设备数已超过8亿台,200多万开发者投入到鸿蒙生态,涵盖资讯、金融、交际、影音等浩繁领域。鸿蒙爆火的背后是举国支持,彰显了国家对科技崛起的期望,自立自强不再受国外技能的打压。
并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用必要开发,也就意味着必要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |