Android移動開發者必須知道的Deep Linking技術
1.概述
Deep Linking(譯:深度鏈接)作為移動開發者可能對這個概念有點陌生,但是對於它的實現原理,說出來大家肯定都知道。不過我們先說一下Deep Linking能做什麼?
它可以喚起指定應用並向其傳遞數據,根據傳遞的數據顯示特定內容頁的詳細信息;
它不再受制於應用,只通過一個鏈接便可喚起應用並跳轉到指定頁面;
它使應用之間產生了聯繫,使應用不再孤立存在;
它優化了用戶體驗,這一點是它最終要達到的目的。
根據Deep Linking能做到的,很多人都能想到如何去實現它了,採用Uri Scheme的方式實現,是的!這是最通用的實現方式,不過該方式有一個問題,就是當點擊一個深度鏈接時,該鏈接必須先經過瀏覽器才能跳轉到相應的應用。不過,從Android 6.0開始,Android又增加了一種更加直接的方式來打開應用——App Links,該技術可以通過一個鏈接直接打開應用,不再需要瀏覽器的協助。下面分兩部分實現Android如何通過Deep Linking從web頁面跳轉到指定應用頁面。
2.Uri Scheme
Uri Scheme並不是什麼特殊的Uri,只是因主要使用了Uri的scheme部分,所以稱為Uri Scheme。關於Uri不了解的可以參考官方URI的API文檔或者網上搜索相關資料查看,此處不講解URI。下面講解如何實現瀏覽器跳轉到指定的APP頁面。
目的:使用Uri Scheme實現從web頁面喚起應用並跳轉到指定頁面
分析:
使用Uri Scheme需要添加怎樣的<intent-filter/>,才能實現從瀏覽器喚起應用?
web頁面如何配置對應的URI,才能實現跳轉到指定頁面?
如何接受web頁面intent攜帶的參數?
實現:
1、配置<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):
<activityn android:name=".activity.MainActivity"n android:label="@string/app_name"n android:launchMode="singleTask">nn <!-- URI Scheme方式 -->n <intent-filter>n <data android:scheme="lkmedemo" />n <action android:name="android.intent.action.VIEW" />n <category android:name="android.intent.category.DEFAULT" />n <category android:name="android.intent.category.BROWSABLE" />n </intent-filter>nn </activity>n
2、web頁面跳轉鏈接配置
只需簡單地添加一個鏈接就可以實現從web頁面喚起App。鏈接如下:
<a href="lkmedemo://?click_id=IEGyekes7">open app with uri-scheme</a>n
分析: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/DeepLinking)
3、參數接收處理
上面指出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的介紹,已經很詳細了,不再贅述,這裡說一下需要注意的問題:
1、<intent-filter>需要按照以下格式進行配置,其中 android:autoVerify="true" 是必須配置項。因為配置了該項,所以需要特別注意AndroidManifest.xml文件中所有的包含<data/>屬性的<intent-filter>,需要在必要的域名伺服器上都添加json校驗文件,有一項校驗不成功都會校驗失敗。具體參考:https://developer.android.com/training/app-links/index.html#testing
<intent-filter android:autoVerify="true">nn<action android:name="android.intent.action.VIEW"/>nn<category android:name="android.intent.category.DEFAULT"/>nn<category android:name="android.intent.category.BROWSABLE"/>nn<data android:host="applinkingexperiment.appspot.com" android:scheme="http"/>nn<data android:host="applinkingexperiment.appspot.com" android:scheme="https"/>nn</intent-filter>n
2、json校驗文件必須能通過https訪問,無論intent-filter中是否聲明了https。
3、響應只能是「application/json」類型的Content-type,其他類型都不支持!
4、校驗不支持重定向,所以不要配置鏈接重定向。
5、生成sha256指紋證書java命令:keytool -list -v -keystore my-release-key.keystor e,json校驗文件中的sha256應該是發布簽名的sha256,可以配置多個,以逗號分隔。
附:
查看webview的User Agent:
https://developer.chrome.com/multidevice/user-agent
DeepLinking Demo 該demo模擬了web頁面跳轉打開應用的場景,通過webview載入本地html文件,並通過點擊鏈接打開應用。請不要為webview添加setWebViewClient()方法,否則無法跳轉!
該Demo跳轉可以按照自己的需要更改scheme,默認採用的是(LinkedME Demohttps://github.com/WFC-LinkedME/LinkedME-Android-Deep-Linking-Demo)
作為跳轉的應用,如若不想更改scheme,需要下載運行LinkedME Demo才能正常跳轉。
聲明:DeepLinking Demo 並沒有對所有手機進行適配,部分手機或者模擬器可能會出現跳轉不成功的情況,請多試幾部手機(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
推薦閱讀:
※Android 內核基於 Linux 設備廠商必須公開內核源代碼,如何逼迫小米公司開源?
※無需 root 實現在 Android 設備上運行 Linux
※利用Xposed實現QQ自動搶紅包和防撤回(純科普)
※MIUI 是否會被其他各廠商同質化?
※如何評價小米手機5的指紋識別技術?