Arkts进阶<应用间跳转 - Deep Linking>
在实际开发过程中会遇到需要外跳其他三方应用的情况我们会用到App Linking和Deep Linking。这里讲解Deep Linking 跳转实现方式。跳转逻辑采用Deep Linking进行跳转时系统会根据接口中传入的uri信息在本地已安装的应用中寻找到符合条件的应用并进行拉起。当匹配到多个应用时会拉起应用选择框。跳转原理Deep Linking基于隐式Want匹配机制中的uri匹配来查询、拉起目标应用。跳转条件目标应用需要跳转的三方应用需要在module.json5配置文件中配置skills标。{module:{abilities:[{skills:[// entities和actions是可以缺省的{entities:[entity.system.home],actions:[ohos.want.action.home]},{actions:[// actions不能为空actions为空会造成目标方匹配失败。ohos.want.action.viewData],uris:[{// scheme必选可以自定义以link为例需要替换为实际的schemescheme:link,host:www.example.comport:80,path:path,type:text/*,linkFeature:Login}]}// 新增一个skill对象用于跳转场景。如果存在多个跳转场景需配置多个skill对象。]},],}}skills1、actions标识能够接收的Action值集合取值通常为系统预定义的action值也允许自定义。一个skill中不建议配置多个action否则可能导致无法匹配预期场景。2、entities标识能够接收的Entity值的集合。一个skill中不建议配置多个entity否则可能导致无法匹配预期场景。3、uris标识与Want中URIUniform Resource Identifier相匹配的集合。4、permissions标识当前UIAbility或ExtensionAbility组件的权限信息。其他应用访问该组件时需要申请相应的权限。一个数组元素为一个权限名称不超过255字节。5、domainVerify标识是否开启域名校验。- true表示开启域名校验。- false表示不开启域名校验。uris:1、scheme:标识URI的协议名部分常见的有http、https、file、ftp等。从API 18开始该标签在参与隐式Want匹配时不区分大小写。uris中仅配置type时可以缺省缺省值为空否则不可缺省。可以理解为简单实用跳转功能时这个是必须的以下都是可以缺省的。2、host标识URI的主机地址部分该标签只有当scheme配置时才生效。3、port标识URI的端口部分。如http默认端口为80https默认端口是443ftp默认端口是21。该标签只有当scheme和host都配置时才生效。4、linkFeature标识URI提供的功能类型如文件打开、分享、导航等用于实现应用间跳转。取值为长度不超过127字节的字符串不支持中文。同一Bundle中声明的linkFeature数量不能超过150个。5、path | pathStartWith | pathRegex标识URI的路径部分path、pathStartWith和pathRegex配置时三选一。path标识URI与want中的路径部分全匹配pathStartWith标识URI与want中的路径部分允许前缀匹配pathRegex标识URI与want中的路径部分允许正则匹配。该标签只有当scheme和host都配置时才生效。6、type标识与Want相匹配的数据类型使用MIMEMultipurpose Internet Mail Extensions类型规范和UniformDataType类型规范。可以与scheme同时配置也可以单独配置。7、utd标识与Want相匹配的标准化数据类型适用于分享等场景。8、maxFileSupported对于指定类型的文件标识一次能接收或打开的最大数量适用于分享等场景需要与utd配合使用。拉起方应用实现应用跳转1、使用openLink实现在openLink接口的link字段中传入目标应用的URL信息并将options字段中的appLinkingOnly配置为false。let link:stringlink://www.example.com;// 此处为实际应用链接let openLinkOptions:OpenLinkOptions{appLinkingOnly:false};try{context.openLink(link,openLinkOptions).then((){hilog.info(DOMAIN_NUMBER,TAG,openLink success.);}).catch((err:BusinessError){hilog.error(DOMAIN_NUMBER,TAG,openLinkfailed.Codeis${err.code},messageis${err.message});});}catch(paramError){hilog.error(DOMAIN_NUMBER,TAG,Failedto startlink.Codeis${paramError.code},messageis${paramError.message});}})这里需要注意的是:uri:link://www.example.com要对应被拉起方scheme:link,host:www.example.com2、使用startAbility实现startAbility接口是将应用链接放入Want中通过调用隐式Want匹配的方法触发应用跳转。Button(DeepLink).onClick((){let contextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;let want:Want{uri:link://www.example.com,// 此处为实际应用链接};try{context.startAbility(want).then((){hilog.info(DOMAIN_NUMBER,TAG,openLink success.);}).catch((err:BusinessError){hilog.error(DOMAIN_NUMBER,TAG,openLinkfailed.Codeis${err.code},messageis${err.message});})}catch(e){hilog.error(DOMAIN_NUMBER,TAG,Failedto startlink.Codeis${e.code},messageis${e.message});}})这里需要注意的是:1、配置方式uri:link://www.example.com要对应被拉起方scheme:link,host:www.example.com如果写成下面这种方式是不对的uri:link://,bundleName:www.example.com2、配置方式scheme:link那么拉起方只需要这样写就可以let want:Want{uri:link://,// 此处为实际应用链接// bundleName: www.example.com 如果使用bundleName字段那么包名错误会导致无法正常拉起这个地方需要特别注意};3、Web组件实现应用跳转目前开发中没有遇到这里引用官方文档内容Web组件可以在onLoadIntercept的回调函数中实现应用跳转。// DeepWebIndex.etsimport{webview}fromkit.ArkWeb;import{BusinessError}fromkit.BasicServicesKit;import{common}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;constDOMAIN_NUMBER0xF811;constTAG[Sample_PullLinking];EntryComponentstructDeepWebIndex{controller:webview.WebviewControllernewwebview.WebviewController();build(){Column(){Web({src:$rawfile(index.html),controller:this.controller}).onLoadIntercept((event){consturl:stringevent.data.getRequestUrl();if(urllink://www.example.com){(this.getUIContext().getHostContext()ascommon.UIAbilityContext).openLink(url).then((){hilog.info(DOMAIN_NUMBER,TAG,openLink success.);}).catch((err:BusinessError){hilog.error(DOMAIN_NUMBER,TAG,openLink failed,err:${JSON.stringify(err)}.);});returntrue;}// 返回true表示阻止此次加载否则允许此次加载returnfalse;})}}}前端代码!--index.html--!DOCTYPE htmlhtmlheadmeta charsetUTF-8/headbodyh1HelloWorld/h1!--方式一、通过绑定事件window.open方法实现跳转--buttonclassdoOpenLinkonclickdoOpenLink()跳转其他应用一/button!--方式二、通过超链接实现跳转--a hreflink://www.example.com跳转其他应用二/a/body/htmlscriptfunctiondoOpenLink(){window.open(link://www.example.com)}/script

相关新闻

最新新闻

日新闻

周新闻

月新闻