App links 允許開發(fā)者將 app 和他們的 web 域名關聯(lián)儒喊。這一舉措是為了最小化用戶遇到“打 開方式”對話框的概率蛹尝。
客戶端工作:
1后豫、App Links 支持 Android6.0+,開發(fā)時請設置編譯和目標版本 api 為 23突那。
2挫酿、在需要支持 App Link 的 activity 增加 intent-filter,并設置相關內容:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="www.android.com" />
<data android:scheme="https" android:host="www.android.com" />
</intent-filter>
android:scheme 必須聲明為http愕难,https 或者兩者都聲明早龟,并且不能聲明其他 scheme。同時必須聲明category為 android.intent.action.VIEW和 android.intent.category.BROWSABLE猫缭。
??當聲明以上內容后葱弟,再 android 6.0+打開對應鏈接時,并且瀏覽器啟動時猜丹,系統(tǒng)就會彈出選擇框供用戶選擇打開鏈接的app芝加。為了讓系統(tǒng)將的app作為默認打開鏈接的app,我們需設置 android:autoVerify為 true射窒。同時在域名服務器做相應配置藏杖。當app manifest中有至少一個 intent-filter設置 autoVerify為true時将塑,當程序安裝時,系統(tǒng)會認證所有注冊在app manifest中的域名蝌麸,只有所有的域名認證通過系統(tǒng)才會將 app 作為對應域名的默認處理對象(貌似現(xiàn)在有個 bug点寥,當?shù)谝淮嗡?域名認證成功后,修改 app manifest 新增其他域名祥楣,再次安裝或升級時隨意新添加的域名也 會被認證成功并作為默認 app开财,估計以后會被改掉。误褪。。)碾褂。 認證只會在安裝和升級的時候會發(fā)生兽间,因此對大多數(shù)用戶來說,再次通過驗證的機會是 在 app 下一次升級的時候
服務端工作:
為了讓app驗證成功正塌,對應的域名服務器必須聲明與app的關聯(lián)嘀略。域名服務器通過一個 json 文件聲明與 app 的聯(lián)系,規(guī)則如下:
https://domain[:optional_port]/.well-known/assetlinks.json
注意乓诽,驗證服務通過 https 服務加密帜羊,所以保證需保證文件可通過 https 服務訪問,不論 intent-filter 中是否聲明了 scheme 為 https鸠天。在第一個 M 預覽版中讼育,重定向到 HTTPS,或者任何其他重定向(301稠集,302 或者 307)貌似都會被忽略并被視為失敗奶段。 assetlinks.json 文件中需包含以下內容:
- package_name:程序包名
- sha256_cert_fingerprints:程序簽名文件 SHA256,支持多個簽名信息
示例:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"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"]
}
}]
支持多個 app 示例:
[{
"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"]
}
}]
測試:
當所有程序工作準備完成,可通過以下請求測試域名服務器配置:
https://digitalassetlinks.googleapis.com/v1/statements:list?
source.web.site=https://<domain1>:<port>&
relation=delegate_permission/common.handle_all_urls
測試客服端:
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://<domain1>:<port>"
檢查link配置狀態(tài)剥纷,可以通過以下命令檢查當前程序對uri的處理方式(最好安裝完成等待一段時間(20s)后再查看):
adb shell dumpsys package domain-preferred-apps
--or--
adb shell dumpsys package d
如果你的程序對應的Status為always則表示驗證成功了痹籍,訪問對應域名時會默認打開
App Links 實現(xiàn)過程:
App 鏈接認證涉及到安卓系統(tǒng)的兩個組建:Package Manager 和 Intent Filter Verifier。 PackageManager 是一個無處不在的標準組建 - 它負責驗證所安裝的 apk 是否有效晦鞋,授予 app 權限蹲缠,另外還可以通過它知道系統(tǒng)上安裝了些什么 app。而 Intent Filter Verifier 則是 Android M 上才有的新玩意兒悠垛。這個組建負責獲取鏈接指向的 JSON 認證线定,解析它,驗證它鼎文,然后將 報告返回給 PackageManger渔肩。
??App 鏈接認證在安裝的時候就一次性完成。不必在每次點擊鏈接的時候都阻塞網(wǎng)絡拇惋。
當一個 package 安裝的時候周偎,或者現(xiàn)有的 package 升級的時候:
- PackageManager 對即將安裝的 apk 做常規(guī)的驗證抹剩。
- 如果成功,這個 package 將被安裝蓉坎,同時發(fā)出一個帶有 android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION 的廣播 intent澳眷,intent 中還攜 帶有該 package 的信息。
- Intent Filter Verifier 的廣播接收器將獲取這個廣播蛉艾。
- 從 package 的標簽中編譯出一個特有主機名的列表钳踊。
- verifier 嘗試從每個特有的主機名中獲取 statements.json。
- 每一個被獲取的 JSON 文件都會檢查它的 application ID 和安裝包的證書勿侯。
- 只有當所有文件同時滿足時拓瞪,才會發(fā)送成功信息到 PackageManager,否則失敗助琐。
- PackageManager 存儲結果祭埂。如果認證失敗,app 鏈接將無法指向你的 app - 你的 app 會像 往常一樣出現(xiàn)在“打開方式”對話框中(除非另一個 app 通過了同一域名的驗證)兵钮。
如果 verifier 不能在 5 秒之內和你的 web 服務器建立鏈接并接收到 HTTP 響應蛆橡,認證會失 敗。同樣的掘譬,如果在認證開始的時候設備是離線的泰演,或者網(wǎng)絡環(huán)境很差,認證也會失敗葱轩。