1.概述
Deep Linking(譯:深度鏈接)作為移動開發(fā)者可能對這個概念有點陌生,但是對于它的實現(xiàn)原理,說出來大家肯定都知道。不過我們先說一下Deep Linking能做什么?
它可以喚起指定應(yīng)用并向其傳遞數(shù)據(jù),根據(jù)傳遞的數(shù)據(jù)顯示特定內(nèi)容頁的詳細信息;
它不再受制于應(yīng)用,只通過一個鏈接便可喚起應(yīng)用并跳轉(zhuǎn)到指定頁面;
它使應(yīng)用之間產(chǎn)生了聯(lián)系,使應(yīng)用不再孤立存在;
它優(yōu)化了用戶體驗,這一點是它最終要達到的目的。
根據(jù)Deep Linking能做到的,很多人都能想到如何去實現(xiàn)它了,采用Uri Scheme的方式實現(xiàn),是的!這是最通用的實現(xiàn)方式,不過該方式有一個問題,就是當(dāng)點擊一個深度鏈接時,該鏈接必須先經(jīng)過瀏覽器才能跳轉(zhuǎn)到相應(yīng)的應(yīng)用。不過,從Android 6.0開始,Android又增加了一種更加直接的方式來打開應(yīng)用——App Links,該技術(shù)可以通過一個鏈接直接打開應(yīng)用,不再需要瀏覽器的協(xié)助。下面分兩部分實現(xiàn)Android如何通過Deep Linking從web頁面跳轉(zhuǎn)到指定應(yīng)用頁面。
2.Uri Scheme

Uri Scheme并不是什么特殊的Uri,只是因主要使用了Uri的scheme部分,所以稱為Uri Scheme。關(guān)于Uri不了解的可以參考官方URI的API文檔或者網(wǎng)上搜索相關(guān)資料查看,此處不講解URI。下面講解如何實現(xiàn)瀏覽器跳轉(zhuǎn)到指定的APP頁面。
目的:使用Uri Scheme實現(xiàn)從web頁面喚起應(yīng)用并跳轉(zhuǎn)到指定頁面
分析:
使用Uri Scheme需要添加怎樣的,才能實現(xiàn)從瀏覽器喚起應(yīng)用?
web頁面如何配置對應(yīng)的URI,才能實現(xiàn)跳轉(zhuǎn)到指定頁面?
如何接受web頁面intent攜帶的參數(shù)?
實現(xiàn):
1、配置
對應(yīng)的組件可以響應(yīng)符合該的URI。如果要實現(xiàn)可以接收瀏覽器發(fā)送的Intent的。就必須添加和? 這兩項。同時還必須能夠接收特定的scheme,所以添加的屬性,并指定scheme的名稱。在AndroidManifest.xml文件中進行配置,具體配置如下圖(摘自:LinkedME):

2、web頁面跳轉(zhuǎn)鏈接配置
只需簡單地添加一個鏈接就可以實現(xiàn)從web頁面喚起App。鏈接如下:
分析:lkmedemo://?click_id=IEGyekes7,其中l(wèi)kmedemo對應(yīng)的就是中配置的scheme,這樣系統(tǒng)才能找到對應(yīng)的組件。該URI只包含了scheme、query兩部分,其中l(wèi)kmedemo屬于scheme部分,?click_id=IEGyekes7部分屬于query部分,在query部分,你可以添加一些參數(shù)。
Notice:query部分的“?”是必須包含的。
當(dāng)你點擊該鏈接的時候會自動打開能接收該URI的應(yīng)用,并且你可以在相應(yīng)的組件中接收參數(shù)并進行后續(xù)處理。
(DeepLinking Demo:https://github.com/ljpww72729/DeepLinking)
3、參數(shù)接收處理
上面指出query部分屬于URI攜帶的一些參數(shù),如何去獲取參數(shù)呢?通過getQueryParameter()方法可獲取query部分的參數(shù),如下:
String click_id = getIntent().getData().getQueryParameter("click_id");
獲取到參數(shù)后就可以根據(jù)參數(shù)進行后續(xù)處理了。
3.App Links

在2015的I/O大會上,谷歌宣布了Android M 支持App鏈接(App Links),這將極大提升用戶體驗,當(dāng)用戶點擊一個web鏈接時能直接跳轉(zhuǎn)到特定的App內(nèi)。
在Android M之前,點擊一個鏈接會彈出一個對話框,詢問用戶使用哪個應(yīng)用打開 - 包括瀏覽器應(yīng)用。但是谷歌在Android M 上實現(xiàn)了一個自動認證(auto-verify)機制,讓開發(fā)者可以避開這個彈出框,使用戶不必去選擇一個列表,直接跳轉(zhuǎn)到他們的App。
官方關(guān)于App Links的介紹,已經(jīng)很詳細了,不再贅述,這里說一下需要注意的問題:
1、需要按照以下格式進行配置,其中android:autoVerify="true"是必須配置項。因為配置了該項,所以需要特別注意AndroidManifest.xml文件中所有的包含屬性的,需要在必要的域名服務(wù)器上都添加json校驗文件,有一項校驗不成功都會校驗失敗。具體參考:https://developer.android.com/training/app-links/index.html#testing

2、json校驗文件必須能通過https訪問,無論intent-filter中是否聲明了https。
3、響應(yīng)只能是“application/json”類型的Content-type,其他類型都不支持!
4、校驗不支持重定向,所以不要配置鏈接重定向。
5、生成sha256指紋證書java命令:keytool -list -v -keystore my-release-key.keystor ? e,json校驗文件中的sha256應(yīng)該是發(fā)布簽名的sha256,可以配置多個,以逗號分隔。
附:
查看webview的User Agent:
https://developer.chrome.com/multidevice/user-agent
DeepLinking Demo該demo模擬了web頁面跳轉(zhuǎn)打開應(yīng)用的場景,通過webview加載本地html文件,并通過點擊鏈接打開應(yīng)用。請不要為webview添加setWebViewClient()方法,否則無法跳轉(zhuǎn)!
該Demo跳轉(zhuǎn)可以按照自己的需要更改scheme,默認采用的是(LinkedME Demohttps://github.com/WFC-LinkedME/LinkedME-Android-Deep-Linking-Demo)
作為跳轉(zhuǎn)的應(yīng)用,如若不想更改scheme,需要下載運行LinkedME Demo才能正常跳轉(zhuǎn)。
聲明:DeepLinking Demo 并沒有對所有手機進行適配,部分手機或者模擬器可能會出現(xiàn)跳轉(zhuǎn)不成功的情況,請多試幾部手機(Android 6.0模擬器正常運行)。
參考:
1.https://developer.chrome.com/multidevice/android/intents
2.https://developer.android.com/training/app-links/index.html
3.https://developer.android.com/training/basics/intents/filters.html
4.https://github.com/hehonghui/android-tech-frontier/blob/master/issue-15/Android-M%E7%9A%84App-Links%E5%AE%9E%E7%8E%B0%E8%AF%A6%E8%A7%A3.md