1# 显式Want跳转切换应用链接跳转适配指导 2 3 4## 概述 5 6从API 12开始,已不再推荐三方应用使用指定Ability方式(即显式Want)拉起其他应用,推荐通过指定[应用链接](app-startup-overview.md#应用链接)的方式来实现。 7 8本章节介绍如何从显式Want跳转切换到应用链接跳转。 9 10## 启动其他应用的UIAbility 11 121. 将待跳转的应用安装到设备,在其对应UIAbility的[module.json5配置文件](../quick-start/module-configuration-file.md)中配置skills标签的entities字段、actions字段和uri字段: 13 - "actions"列表中包含"ohos.want.action.viewData"。 14 - "entities"列表中包含"entity.system.browsable"。 15 - "uris"列表中包含"scheme"为"https"且"domainVerify"为true的元素。uri的匹配规则参考[uri匹配](explicit-implicit-want-mappings.md#uri匹配规则), domainVerify为true代表开启域名检查,通过applinking匹配该应用时需经过配置的域名校验后才能匹配到。applinking域名配置具体可参考AppLinking。 16 17 ```json 18 { 19 "module": { 20 // ... 21 "abilities": [ 22 { 23 // ... 24 "skills": [ 25 { 26 "entities": [ 27 "entity.system.browsable" 28 ], 29 "actions": [ 30 "ohos.want.action.viewData" 31 ], 32 "uris": [ 33 { 34 "scheme": "https", 35 "host": "www.example.com", 36 } 37 ], 38 "domainVerify": true 39 } 40 ] 41 } 42 ] 43 } 44 } 45 ``` 46 472. 调用方通过[openLink](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextopenlink12)接口执行跳转,在接口入参需要传入转换后的link和配置[options](../reference/apis-ability-kit/js-apis-app-ability-openLinkOptions.md), 不再传入bundleName、moduleName和abilityName。系统会根据传入的link匹配到符合skill配置的应用。 48 - 当options中的appLinkingOnly为true时,匹配到的应用会经过应用市场域名检查(需联网)返回域名校验检查的唯一匹配项或未匹配结果。 49 - 当options中的appLinkingOnly为false时,会优先尝试以AppLinking的方式拉起,如果没有匹配的应用则改为使用DeepLinking的方式拉起目标应用。 50 51 具体请参考AppLinking开发指南。 52 53 ```ts 54 import { common } from '@kit.AbilityKit'; 55 import OpenLinkOptions from '@ohos.app.ability.OpenLinkOptions'; 56 import { BusinessError } from '@ohos.base'; 57 import hilog from '@ohos.hilog'; 58 59 const TAG: string = '[UIAbilityComponentsOpenLink]'; 60 const DOMAIN_NUMBER: number = 0xFF00; 61 62 @Entry 63 @Component 64 struct Index { 65 build() { 66 Button('start link', { type: ButtonType.Capsule, stateEffect: true }) 67 .width('87%') 68 .height('5%') 69 .margin({ bottom: '12vp' }) 70 .onClick(() => { 71 let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 72 // let want: Want = { 73 // bundleName: "com.test.example", 74 // moduleName: "entry", 75 // abilityName: "EntryAbility" 76 // }; 77 // try { 78 // context.startAbility(want) 79 // .then(() => { 80 // hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.'); 81 // }).catch((err: BusinessError) => { 82 // hilog.error(DOMAIN_NUMBER, TAG, `startAbility failed. Code is ${err.code}, message is ${err.message}`); 83 // }) 84 // } catch (paramError) { 85 // hilog.error(DOMAIN_NUMBER, TAG, `Failed to startAbility. Code is ${paramError.code}, message is ${paramError.message}`); 86 // } 87 let link: string = "https://www.example.com"; 88 let openLinkOptions: OpenLinkOptions = { 89 // 匹配的abilities选项是否需要通过AppLinking域名校验,匹配到唯一配置过的应用ability 90 appLinkingOnly: true, 91 // 同want中的parameter,用于传递的参数 92 parameters: {demo_key: "demo_value"} 93 }; 94 95 try { 96 context.openLink(link, openLinkOptions) 97 .then(() => { 98 hilog.info(DOMAIN_NUMBER, TAG, 'open link success.'); 99 }).catch((err: BusinessError) => { 100 hilog.error(DOMAIN_NUMBER, TAG, `open link failed. Code is ${err.code}, message is ${err.message}`); 101 }) 102 } catch (paramError) { 103 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start link. Code is ${paramError.code}, message is ${paramError.message}`); 104 } 105 }) 106 } 107 } 108 ``` 109 110## 启动其他应用的UIAbility并获取返回结果 111 1121. 将待跳转的应用安装到设备,在其对应UIAbility的[module.json5配置文件](../quick-start/module-configuration-file.md)中配置skills标签的entities字段、actions字段和uri字段: 113 114 - "actions"列表中包含"ohos.want.action.viewData"。 115 - "entities"列表中包含"entity.system.browsable"。 116 - "uris"列表中包含"scheme"为"https"且"domainVerify"为true的元素。uri的匹配规则参考[uri匹配](explicit-implicit-want-mappings.md#uri匹配规则), domainVerify为true代表开启域名检查,通过applinking匹配该应用时需经过配置的域名校验后才能匹配到。applinking域名配置具体可参考App Linking。 117 118 ```json 119 { 120 "module": { 121 // ... 122 "abilities": [ 123 { 124 // ... 125 "skills": [ 126 { 127 "entities": [ 128 "entity.system.browsable" 129 ], 130 "actions": [ 131 "ohos.want.action.viewData" 132 ], 133 "uris": [ 134 { 135 "scheme": "https", 136 "host": "www.example.com", 137 } 138 ], 139 "domainVerify": true 140 } 141 ] 142 } 143 ] 144 } 145 } 146 ``` 147 1482. 调用方通过[openLink](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextopenlink12)接口执行跳转,在接口入参需要传入转换后的link和配置[options](../reference/apis-ability-kit/js-apis-app-ability-openLinkOptions.md), 不再传入bundleName、moduleName和abilityName。系统会根据传入的link匹配到符合skills配置的应用。AbilityResult回调结果返回通过入参传入回调函数,在启动ability停止自身后返回给调用方的信息。启动成功和失败结果仍通过Promise返回。<br> 149 - 当options中的appLinkingOnly为true时,匹配到的应用会经过应用市场域名检查(需联网)返回域名校验检查的唯一匹配项或未匹配结果。 150 - 当options中的appLinkingOnly为false时,会优先尝试以AppLinking的方式拉起,如果没有匹配的应用则改为使用DeepLinking的方式拉起目标应用。 151 <br>具体请参考AppLinking开发指南。 152 153 ```ts 154 import { common } from '@kit.AbilityKit'; 155 import OpenLinkOptions from '@ohos.app.ability.OpenLinkOptions'; 156 import { BusinessError } from '@ohos.base'; 157 import hilog from '@ohos.hilog'; 158 159 const TAG: string = '[UIAbilityComponentsOpenLink]'; 160 const DOMAIN_NUMBER: number = 0xFF00; 161 162 @Entry 163 @Component 164 struct Index { 165 build() { 166 Button('start link', { type: ButtonType.Capsule, stateEffect: true }) 167 .width('87%') 168 .height('5%') 169 .margin({ bottom: '12vp' }) 170 .onClick(() => { 171 let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 172 // let want: Want = { 173 // bundleName: "com.test.example", 174 // moduleName: "entry", 175 // abilityName: "EntryAbility" 176 // }; 177 // try { 178 // context.startAbilityForResult(want) 179 // .then((data) => { 180 // hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success. data:' + JSON.stringify(data)); 181 // }).catch((err: BusinessError) => { 182 // hilog.error(DOMAIN_NUMBER, TAG, `startAbility failed. Code is ${err.code}, message is ${err.message}`); 183 // }) 184 // } catch (paramError) { 185 // hilog.error(DOMAIN_NUMBER, TAG, `Failed to startAbility. Code is ${paramError.code}, message is ${paramError.message}`); 186 // } 187 let link: string = "https://www.example.com"; 188 let openLinkOptions: OpenLinkOptions = { 189 // 匹配的abilities选项是否需要通过AppLinking域名校验,匹配到唯一配置过的应用ability 190 appLinkingOnly: true, 191 // 同want中的parameter,用于传递的参数 192 parameters: {demo_key: "demo_value"} 193 }; 194 195 try { 196 context.openLink(link, openLinkOptions, (err, data) => { 197 // AbilityResult callback回调,仅在被拉起ability死亡时触发 198 hilog.info(DOMAIN_NUMBER, TAG, 'open link success. Callback result:' + JSON.stringify(data)); 199 }).then(() => { 200 hilog.info(DOMAIN_NUMBER, TAG, 'open link success.'); 201 }).catch((err: BusinessError) => { 202 hilog.error(DOMAIN_NUMBER, TAG, `open link failed. Code is ${err.code}, message is ${err.message}`); 203 }) 204 } catch (paramError) { 205 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start link. Code is ${paramError.code}, message is ${paramError.message}`); 206 } 207 }) 208 } 209 } 210 ```