移動(dòng)應(yīng)用開發(fā)時(shí)常遇到應(yīng)用跳轉(zhuǎn)、h5喚起原生頁(yè)面等使用場(chǎng)景,所以一個(gè)健壯的應(yīng)用需要具備路由的能力。常見的操作方法需要在manifest中針對(duì)每個(gè)頁(yè)面進(jìn)行配置,設(shè)想應(yīng)用有大量的頁(yè)面那配置工作豈不是費(fèi)時(shí)費(fèi)力,所以我們便來(lái)一起看看Android Studio 2.3給我們帶來(lái)了什么便利
概覽及使用
App Links是Android M以上的特有功能,即實(shí)現(xiàn)了auto-verify支持用戶點(diǎn)擊一個(gè)鏈接即可喚起APP,而不用像以往版本中需要點(diǎn)擊一個(gè)選擇框列表。為了使自己的應(yīng)用支持App Links,我們常需要以下三個(gè)步驟:
- 在manifest中創(chuàng)建Intent filter
- 在Activity中編寫對(duì)應(yīng)的代碼邏輯處理收到的url links
- 通過(guò)配置證書文件,關(guān)聯(lián)網(wǎng)頁(yè)和應(yīng)用
Android Studio 2.3及以上版本中提供了App Links Assistant協(xié)助開發(fā)者進(jìn)行快速配置,該功能可在tools > App Links Assistant中開啟。

配置Intent filsters
首先打開URL匹配規(guī)則編輯器,配置基本的Scheme、Host等信息,并指定關(guān)聯(lián)的Activity對(duì)這塊不是很了解的同學(xué)可以點(diǎn)擊App Manifest了解各個(gè)字段的含義以及優(yōu)先級(jí)。

配置完畢后可查看已配置的映射的關(guān)系,并可以通過(guò)輸入U(xiǎn)RL進(jìn)行校驗(yàn)是否調(diào)通

選擇Activity
配置好mapping后,點(diǎn)擊Select Activity選擇上述配置好的Activity可自動(dòng)生成以下代碼。變量appLinkData以Uri的形式存儲(chǔ)了進(jìn)行傳遞的數(shù)據(jù),針對(duì)具體頁(yè)面開發(fā)者可編寫特定的處理邏輯。
// ATTENTION: This was auto-generated to handle app links.
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
關(guān)聯(lián)應(yīng)用
前兩步已經(jīng)使我們的應(yīng)用具備了URL支持,在最后一步中我們將生成站點(diǎn)的配置文件,使其能夠喚起我們的應(yīng)用。此處需要根據(jù)個(gè)人用途選擇Signing config或keystore并選擇debug/release類型,點(diǎn)擊生成的配置文件為assetlinks.json,并將其上傳至自己的站點(diǎn)。

根據(jù)官方文檔,特別注意的是系統(tǒng)識(shí)別Links需要通過(guò)https協(xié)議,故我們需要確保assetlinks.json可以通過(guò)https鏈接,無(wú)論我們的應(yīng)用是否在Intent-filter中包含了https
通過(guò)配置assetlinks.json我們可以使站點(diǎn)具備喚起單一APP或者多個(gè)APP的能力,文件中使用了以下字段來(lái)關(guān)聯(lián)app:
- package_name 即manifest中定義的包名
- sha256_cert_fingerprints 即應(yīng)用的sha256指紋證書
而指紋證書可以調(diào)用命令行進(jìn)行生成
$ keytool -list -v -keystore my-release-key.keystore
若需要關(guān)聯(lián)多個(gè)app,可以參照下面的格式進(jìn)行配置
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "example.com.puppies.app",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "example.com.monkeys.app",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
最后點(diǎn)擊Test App Links可以在設(shè)備或模擬器上進(jìn)行測(cè)試。
后記
缺陷
使用App Links能為開發(fā)者帶來(lái)福利,但目前仍然有幾個(gè)不可忽視的缺陷:
- 當(dāng)app配置好了對(duì)App Links的支持之后,只有運(yùn)行在Android M上的用戶才能直接體會(huì)到這項(xiàng)好處
- 開發(fā)者需要維護(hù)與App相關(guān)聯(lián)的站點(diǎn),并支持上傳認(rèn)證文件,可能造成更大的財(cái)力精力開銷
擴(kuò)展
利用App Links Assistant我們可以快速配置應(yīng)用全局路由的支持,由于manifest中已存在url與activity的映射關(guān)系,我們可以基于Intent和PackageManager設(shè)計(jì)一個(gè)簡(jiǎn)單的路由框架。比起手動(dòng)在manifest增刪,App Links Assistant能幫助我們高效管理當(dāng)前的映射關(guān)系并進(jìn)行測(cè)試。