1.概述
Deep Linking(譯:深度鏈接)作為移動開發(fā)者可能對這個概念有點(diǎn)陌生则涯,但是對于它的實(shí)現(xiàn)原理篙梢,說出來大家肯定都知道崎页。不過我們先說一下Deep Linking能做什么孝宗?
它可以喚起指定應(yīng)用并向其傳遞數(shù)據(jù)捣卤,根據(jù)傳遞的數(shù)據(jù)顯示特定內(nèi)容頁的詳細(xì)信息异逐;
它不再受制于應(yīng)用捶索,只通過一個鏈接便可喚起應(yīng)用并跳轉(zhuǎn)到指定頁面;
它使應(yīng)用之間產(chǎn)生了聯(lián)系灰瞻,使應(yīng)用不再孤立存在腥例;
它優(yōu)化了用戶體驗(yàn),這一點(diǎn)是它最終要達(dá)到的目的酝润。
根據(jù)Deep Linking能做到的燎竖,很多人都能想到如何去實(shí)現(xiàn)它了,采用Uri Scheme的方式實(shí)現(xiàn)要销,是的构回!這是最通用的實(shí)現(xiàn)方式,不過該方式有一個問題疏咐,就是當(dāng)點(diǎn)擊一個深度鏈接時纤掸,該鏈接必須先經(jīng)過瀏覽器才能跳轉(zhuǎn)到相應(yīng)的應(yīng)用。不過浑塞,從Android 6.0開始借跪,Android又增加了一種更加直接的方式來打開應(yīng)用——App Links,該技術(shù)可以通過一個鏈接直接打開應(yīng)用酌壕,不再需要瀏覽器的協(xié)助掏愁。下面分兩部分實(shí)現(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辛掠。下面講解如何實(shí)現(xiàn)瀏覽器跳轉(zhuǎn)到指定的APP頁面。
目的:使用Uri Scheme實(shí)現(xiàn)從web頁面喚起應(yīng)用并跳轉(zhuǎn)到指定頁面
分析:
使用Uri Scheme需要添加怎樣的溅蛉,才能實(shí)現(xiàn)從瀏覽器喚起應(yīng)用公浪?
web頁面如何配置對應(yīng)的URI他宛,才能實(shí)現(xiàn)跳轉(zhuǎn)到指定頁面?
如何接受web頁面intent攜帶的參數(shù)欠气?
實(shí)現(xiàn):
1厅各、配置
對應(yīng)的組件可以響應(yīng)符合該的URI。如果要實(shí)現(xiàn)可以接收瀏覽器發(fā)送的Intent的预柒。就必須添加和? 這兩項(xiàng)队塘。同時還必須能夠接收特定的scheme,所以添加的屬性宜鸯,并指定scheme的名稱憔古。在AndroidManifest.xml文件中進(jìn)行配置,具體配置如下圖(摘自:LinkedME):
2淋袖、web頁面跳轉(zhuǎn)鏈接配置
只需簡單地添加一個鏈接就可以實(shí)現(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)你點(diǎn)擊該鏈接的時候會自動打開能接收該URI的應(yīng)用保檐,并且你可以在相應(yīng)的組件中接收參數(shù)并進(jìn)行后續(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ù)進(jìn)行后續(xù)處理了盐肃。
3.App Links
在2015的I/O大會上,谷歌宣布了Android M 支持App鏈接(App Links)权悟,這將極大提升用戶體驗(yàn)砸王,當(dāng)用戶點(diǎn)擊一個web鏈接時能直接跳轉(zhuǎn)到特定的App內(nèi)。
在Android M之前峦阁,點(diǎn)擊一個鏈接會彈出一個對話框谦铃,詢問用戶使用哪個應(yīng)用打開 - 包括瀏覽器應(yīng)用。但是谷歌在Android M 上實(shí)現(xiàn)了一個自動認(rèn)證(auto-verify)機(jī)制榔昔,讓開發(fā)者可以避開這個彈出框驹闰,使用戶不必去選擇一個列表瘪菌,直接跳轉(zhuǎn)到他們的App。
官方關(guān)于App Links的介紹嘹朗,已經(jīng)很詳細(xì)了师妙,不再贅述,這里說一下需要注意的問題:
1屹培、需要按照以下格式進(jìn)行配置默穴,其中android:autoVerify="true"是必須配置項(xiàng)。因?yàn)榕渲昧嗽擁?xiàng)褪秀,所以需要特別注意AndroidManifest.xml文件中所有的包含屬性的蓄诽,需要在必要的域名服務(wù)器上都添加json校驗(yàn)文件,有一項(xiàng)校驗(yàn)不成功都會校驗(yàn)失敗媒吗。具體參考:https://developer.android.com/training/app-links/index.html#testing
2仑氛、json校驗(yàn)文件必須能通過https訪問,無論intent-filter中是否聲明了https闸英。
3调衰、響應(yīng)只能是“application/json”類型的Content-type,其他類型都不支持自阱!
4嚎莉、校驗(yàn)不支持重定向,所以不要配置鏈接重定向沛豌。
5趋箩、生成sha256指紋證書java命令:keytool -list -v -keystore my-release-key.keystor ? e,json校驗(yàn)文件中的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文件竹勉,并通過點(diǎn)擊鏈接打開應(yīng)用。請不要為webview添加setWebViewClient()方法娄琉,否則無法跳轉(zhuǎn)次乓!
該Demo跳轉(zhuǎn)可以按照自己的需要更改scheme,默認(rèn)采用的是(LinkedME Demohttps://github.com/WFC-LinkedME/LinkedME-Android-Deep-Linking-Demo)
作為跳轉(zhuǎn)的應(yīng)用孽水,如若不想更改scheme票腰,需要下載運(yùn)行LinkedME Demo才能正常跳轉(zhuǎn)。
聲明:DeepLinking Demo 并沒有對所有手機(jī)進(jìn)行適配女气,部分手機(jī)或者模擬器可能會出現(xiàn)跳轉(zhuǎn)不成功的情況杏慰,請多試幾部手機(jī)(Android 6.0模擬器正常運(yùn)行)。
參考:
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