Android移動開發者必須知道的Deep Linking技術

1.概述html

Deep Linking(譯:深度連接)做爲移動開發者可能對這個概念有點陌生,可是對於它的實現原理,說出來你們確定都知道。不過咱們先說一下Deep Linking能作什麼?java

  • 它能夠喚起指定應用並向其傳遞數據,根據傳遞的數據顯示特定內容頁的詳細信息;android

  • 它再也不受制於應用,只經過一個連接即可喚起應用並跳轉到指定頁面;git

  • 它使應用之間產生了聯繫,使應用再也不孤立存在;github

  • 它優化了用戶體驗,這一點是它最終要達到的目的。web

根據Deep Linking能作到的,不少人都能想到如何去實現它了,採用Uri Scheme的方式實現,是的!這是最通用的實現方式,不過該方式有一個問題,就是當點擊一個深度連接時,該連接必須先通過瀏覽器才能跳轉到相應的應用。不過,從Android 6.0開始,Android又增長了一種更加直接的方式來打開應用——App Links,該技術能夠經過一個連接直接打開應用,再也不須要瀏覽器的協助。下面分兩部分實現Android如何經過Deep Linking從web頁面跳轉到指定應用頁面。chrome

2.Uri Scheme
圖片描述json

Uri Scheme並非什麼特殊的Uri,只是因主要使用了Uri的scheme部分,因此稱爲Uri Scheme。關於Uri不瞭解的能夠參考官方URI的API文檔或者網上搜索相關資料查看,此處不講解URI。下面講解如何實現瀏覽器跳轉到指定的APP頁面。瀏覽器

目的:使用Uri Scheme實現從web頁面喚起應用並跳轉到指定頁面服務器

分析:
使用Uri Scheme須要添加怎樣的<intent-filter/>,才能實現從瀏覽器喚起應用?
web頁面如何配置對應的URI,才能實現跳轉到指定頁面?
如何接受web頁面intent攜帶的參數?

實現:
一、配置<intent-filter/>
<intent-filter/>對應的組件能夠響應符合該<intent-filter/>的URI。若是要實現能夠接收瀏覽器發送的Intent的<intent-filter/>。就必須添加<action android:name="android.intent.action.VIEW" />和 <category android:name="android.intent.category.DEFAULT" />這兩項。同時還必須可以接收特定的scheme,因此添加<data/>的屬性,並指定scheme的名稱。在AndroidManifest.xml文件中進行配置,具體配置以下圖(摘自:LinkedME):

<activity
            android:name=".activity.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask">
           <!-- URI Scheme方式 -->
            <intent-filter>
                <data android:scheme="lkmedemo" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
  </activity>

二、web頁面跳轉連接配置
只需簡單地添加一個連接就能夠實現從web頁面喚起App。連接以下:
open app with uri-scheme
分析:lkmedemo://?click_id=IEGyekes7,其中lkmedemo對應的就是<intent-filter/>中配置的scheme,這樣系統才能找到對應的組件。該URI只包含了scheme、query兩部分,其中lkmedemo屬於scheme部分,?click_id=IEGyekes7部分屬於query部分,在query部分,你能夠添加一些參數。
Notice:query部分的「?」是必須包含的。
當你點擊該連接的時候會自動打開能接收該URI的應用,而且你能夠在相應的組件中接收參數並進行後續處理。
(DeepLinking Demo:https://github.com/ljpww72729...

三、參數接收處理
上面指出query部分屬於URI攜帶的一些參數,如何去獲取參數呢?經過getQueryParameter()方法可獲取query部分的參數,以下:
String click_id = getIntent().getData().getQueryParameter("click_id");
獲取到參數後就能夠根據參數進行後續處理了。

3.App Links
圖片描述

在2015的I/O大會上,谷歌宣佈了Android M 支持App連接(App Links),這將極大提高用戶體驗,當用戶點擊一個web連接時能直接跳轉到特定的App內。

在Android M以前,點擊一個連接會彈出一個對話框,詢問用戶使用哪一個應用打開 - 包括瀏覽器應用。可是谷歌在Android M 上實現了一個自動認證(auto-verify)機制,讓開發者能夠避開這個彈出框,使用戶沒必要去選擇一個列表,直接跳轉到他們的App。

官方關於App Links的介紹,已經很詳細了,再也不贅述,這裏說一下須要注意的問題:
一、<intent-filter>須要按照如下格式進行配置,其中 android:autoVerify="true" 是必須配置項。由於配置了該項,因此須要特別注意AndroidManifest.xml文件中全部的包含<data/>屬性的<intent-filter>,須要在必要的域名服務器上都添加json校驗文件,有一項校驗不成功都會校驗失敗。具體參考:https://developer.android.com...

<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:host="applinkingexperiment.appspot.com" android:scheme="http"/>
<data android:host="applinkingexperiment.appspot.com" android:scheme="https"/>
</intent-filter>

二、json校驗文件必須能經過https訪問,不管intent-filter中是否聲明瞭https。
三、響應只能是「application/json」類型的Content-type,其餘類型都不支持!
四、校驗不支持重定向,因此不要配置連接重定向。
五、生成sha256指紋證書java命令:keytool -list -v -keystore my-release-key.keystor e,json校驗文件中的sha256應該是發佈簽名的sha256,能夠配置多個,以逗號分隔。

附:
查看webview的User Agent:
https://developer.chrome.com/...
DeepLinking Demo 該demo模擬了web頁面跳轉打開應用的場景,經過webview加載本地html文件,並經過點擊連接打開應用。請不要爲webview添加setWebViewClient()方法,不然沒法跳轉!
該Demo跳轉能夠按照本身的須要更改scheme,默認採用的是(LinkedME Demohttps://github.com/WFC-Linked...
做爲跳轉的應用,如若不想更改scheme,須要下載運行LinkedME Demo才能正常跳轉。
聲明:DeepLinking Demo 並無對全部手機進行適配,部分手機或者模擬器可能會出現跳轉不成功的狀況,請多試幾部手機(Android 6.0模擬器正常運行)。

參考:
1.https://developer.chrome.com/...
2.https://developer.android.com...
3.https://developer.android.com...
4.https://github.com/hehonghui/...

圖片描述

關注咱們

相關文章
相關標籤/搜索