簡介
使用App Linking進行跳轉時,系統會根據接口傳入的uri信息(HTTPS鏈接)將用戶引導至目標應用中的特定內容,無論應用是否已安裝,用戶都可以訪問到鏈接對應的內容,跳轉體驗相比Deep Linking方式更加順暢。
實現原理
-
App Linking在DeepLinking的基礎上增加了域名校驗環節,通過域名校驗,可幫助用戶消除歧義,識別合法歸屬于域名的應用,使鏈接更加安全可靠。
-
App Linking要求對于同一HTTPS網址,有應用和網頁兩種內容的呈現方式。當應用安裝時則優先打開應用去呈現內容;當應用未安裝時,則打開瀏覽器呈現Web版的內容。
目標方應用開發指導
1、登錄AppGallery Connect,點擊“我的項目”。
2、選擇「開發與服務」
3、在左側導航欄中選擇“增長->App Linking”,進入App Linking頁面,點擊“立即開通”。
4、如果項目此時未設置數據處理位置,在提示框內啟用數據處理位置和設置默認數據處理位置,點擊“確定”
5、進入“項目設置>常規”頁面,選擇創建的HarmonyOS應用,查看應用的APP ID,后續開發需要使用該ID。
?
在開發者網站上關聯應用
在開發者的網站域名服務器上做如下配置。后續當您配置該網站域名時,系統會通過此文件確認哪些應用才是合法歸屬于此域名的,使鏈接更加安全可靠。
1、創建域名配置文件applinking.json,內容如下:
?
{"applinking": {"apps": [{"appIdentifier": "1234567"}]}
}
說明:
- appIdentifier填寫在AGC控制臺開通App Linking服務的步驟5展示的APP ID
- 同一個網站域名可以關聯多個應用,只需要在“apps”列表里放置多個“appIdentifier”元素即可,其中每個“appIdentifier”元素對應每個應用
2、將配置文件放在域名服務器固定的目錄下:
https://domain.name/.well-known/applinking.json
例如:開發者的服務器域名為www.example.com,則必須將applinking.json文件放在如下位置:
https://www.example.com/.well-known/applinking.json
在AGC控制臺關聯網址域名
1、在左側導航欄中選擇”增長->App Linking",選擇“應用鏈接(API>=12適用)”頁簽,點擊“創建”
說明:
- Harmony OS應用開發者僅需關注“應用鏈接(API>=12)”頁簽,其他頁簽為元服務或其他系統適用的配置,無需關注
- 如果界面未展示“應用鏈接 (API>=12)”頁簽,請在右側的“自定義配置”中勾選
2、填寫在開發者網站上關聯應用的網址域名,例如:https://www.baidu.com。必須輸入精確的域名,不可輸入包含特殊字符的模糊網址。
說明:
不可以在域名后面加/,即不支持“https://www.example.com/”形式

3、設置完成后點擊“發布”,AGC會對該網站域名的配置文件所包含的應用與本項目內的應用列表進行交集校驗。
說明:應用鏈接發布完成后,如果距離上次更新超過24小時,系統會取域名服務器上重新獲取配置文件進行校驗。
例如:在4月7日17:21創建了應用鏈接,系統會在4月8日17:30去域名服務器上重新獲取配置文件,然后進行交集校驗,更新發布狀態
如果域名的配置文件中有應用存在本項目中,則發布成功,點擊“查看”可顯示該域名關聯的應用信息。
- 如果異步校驗中,則狀態為“發布中”。
- 如果配置文件中沒有任何應用在本項目中,則發布失敗,點擊“查看”可顯示發布失敗的原因。
在DevEco Studio中配置關聯的網站域名
在應用的module.json5文件中進行如下配置,以聲明應用關聯的域名地址,并開啟域名校驗開關。
- “entities”列表中必須包含“entity.system.browsable”
- "actions"列表中必須包含“ohos.want.action.viewData”
- "uris"列表中必須包含“scheme”為“https”且“host”為域名地址的元素,可選屬性包含“path”、“pathStartWith”和“pathRegex”,具體參見“uris標簽說明”。
- “donmainVerify”設置為true,表示開啟域名校驗開關
說明:skills標簽下默認包含一個skill對象,用于標識應用入口。應用跳轉鏈接不能在該skill對象中配置,需要創建獨立的skill對象,否則會導致配置無法生效。
例如,聲明應用關聯的域名是www.baidu.com,則需進行如下配置。
{"module": {"abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ts","icon": "$media:icon","label": "$string:EntryAbility_label",// 請將exported配置為true;如果exported為false,僅具有權限的系統應用能夠拉起該應用,否則無法拉起應用"exported": true,"startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","skills": [{"entities": ["entity.system.home"],"actions": [// API19及以上版本須配置為"ohos.want.action.home",API18及以下版本請配置為"action.system.home""ohos.want.action.home"]},{"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",// path可選,表示域名服務器上的目錄或文件路徑,例如www.example.com/path1中的path1// 如果應用只能處理部分特定的path,則此處應該配置應用所支持的path,避免出現應用不能處理的path鏈接也被引流到應用中的問題"path": "path1"}],// domainVerify須設置為true"domainVerify": true}// 若有其他跳轉能力,如推送消息跳轉、NFC跳轉,可新增一個skill對象,防止與App Linking業務沖突]}]}
}
處理傳入的鏈接
在應用的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=showalllet uri = want?.uri if (uri) {// 從鏈接中解析query參數,拿到參數后,開發者可根據自己的業務需求進行后續的處理。let urlObject = url.URL.parseURL(want?.uri);let action = urlObject.params.get('action')// 例如,當action為showall時,展示所有的節目。if (action === "showall"){//...}//...}}
}
若要根據鏈接參數啟動UIAbility的指定頁面組件,請參考“啟動UIAbility的指定頁面”。
?
拉起方實現跳轉指導
支持App Linking的應用可以通過如下方式被拉起:
?
1、通過openLink接口拉起。
拉起方應用通過UIAbilityContext.openLink()接口,傳入目標應用的鏈接,拉起目標應用。
openLink接口提供了兩種拉起目標應用的方式,開發者可根據業務需求進行選擇。
方式一:僅以App Linking的方式打開應用。
將appLinkingOnly參數設置為true,若有App Linking匹配的應用,則直接打開應用。若無App Linking匹配的應用,則拋異常該開發者進行處理。
適用于無法打開目標應用時,開發者做了相應的異常處理。例如:拉起方應用集成了ArkWeb,當目標應用不存在時,可通過ArkWeb打開鏈接。
方式二:以App Linking 優先方式打開應用
將appLinkingOnly參數設置為false或者不傳,若有App Linking匹配的應用,則直接打開目標應用。若無App Linking匹配的應用,則嘗試以瀏覽器打開鏈接的方式打開應用。
適用于無法打開目標應用時,開發者未做任何處理。此時目標應用不存在時,會通過系統瀏覽器打開鏈接。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { GlobalContext } from '../common/GlobalContext';@Entry
@Component
struct Index {build() {Button('start link', { type: ButtonType.Capsule, stateEffect: true }).width('87%').height('5%').margin({ bottom: '12vp' }).onClick(() => {let context = GlobalContext.getContext();let link: string = "https://www.example.com/programs?action=showall";// 僅以App Linking的方式打開應用context.openLink(link, { appLinkingOnly: true }).then(() => {hilog.info(0x0000, 'testTag', `Succeeded in opening link.`);}).catch((error: BusinessError) => {hilog.error(0x0000, 'testTag', `Failed to open link, code: ${error.code}, message: ${error.message}`);});})}
}
2、通過系統瀏覽器或ArkWeb拉起
ArkWeb深度集成了App Linking的能力,當用戶在系統瀏覽器或者集成ArkWeb的應用的網頁上點擊某個鏈接時,若有鏈接匹配的應用,系統則會通過App Linking的能力優先拉起目標應用,并在應用內展示相應的內容。此機制有如下限制:
- 如果用戶當前瀏覽的網頁的域名與點擊的App Linking鏈接的域名完全一致,則系統會繼續在系統瀏覽器或ArkWeb中打開該鏈接,以維持連貫的用戶瀏覽體驗。
- 如果域名不完全一致(例如:example.com和app.example.com),則系統會通過App Linking能力優先拉起目標應用,并在應用內展示相應的內容。
參考:文檔中心?