Android App Links 設定心得筆記

一個更好的 Deep Link for Android

Jui Yuan Liou
8 min readDec 26, 2018
No way!!!!

簡介

要實現跨 App 之間的跳轉,在 Android 上第一個想到的應該會是 Deep Link。Deep Link 是透過一組 Scheme,例如 myapp://sometext/123 ,在 AndroidManifest 註冊 Intent Filter,讓 Android 可以在處理 myapp 這個 Scheme 時,開啟註冊的 App。當然也可以處理 httphttps 這兩個網址常用的 Scheme。

不過,每個人都能註冊同一個 Scheme,被惡意重複註冊 Scheme 而開啟了其他的 App 是可能發生的。就像是 httphttps 這兩組,通常使用者點下去後,會出現很多 App 可以處理,使用者需要從裡頭選擇一個來處理。

Google 在 Android 6.0 (APIv23, Marshmallow) 釋出時,也提出了新的 Android App Links。就能解決上述提到的幾個問題,使用者不必再從可以處理的程式之中選擇由哪個程式處理,Android App Links 直接將使用者帶到目標的程式。 (當然,如果沒安裝目標 App 需要另外處理,但不在本文的討論範圍)
另外,要設定 Android App Links,可能需要和 Web front-end 合作一下。(雖然也能自己來)

設定

Android Studio 2.3 之後提供類似精靈介面(全名是 App Links Assistant),讓開發者可以簡單的設定 App Links。你可以從選單列的 Tools -> App Links Assistant 開啟,照著 Assistant 側邊欄中的四個步驟設定 (可以將第三個與 Web 配合的步驟調整成最後一個),應該就能簡單的設定完成 (如果要配置 Deep Link,走 1、2、4 也能達成)。

步驟一是在 Android Manifest 檔案裡頭加入 Intent Filter,例如電子書搜尋服務用來做 App Link 的位置是 https://taiwan-ebook-lover.github.io/search?q=keyword,Host 是 https://taiwan-ebook-lover.github.io 這段,後面取變數使用 /search 這個 PathPrefix 來偵測(如果使用 PathPrefix / 符號是必須的,別忘了),另外,需要指定用來開啟 App Links 的 Activity。
你可以在 Check URL Mapping 對話框內檢查 App Links 設定對於目標網址是否有效。

設定完成後在生成的 Intent Filter XML 標籤內加上 android:autoVerify="true" ,如此一來使用者啟動這個 App Links 後就不用手動選擇需要哪一個 App 來開啟了。

大概會是這個模樣

步驟二是於 Activity 中處理 App Links 的資料 (data 放在 Intent 裡頭),通常在 onCreate() 之中處理。如果你的 LaunchMode 設定為 SingleTop,別忘了onNewIntent() 也要處理 App Links。
電子書搜尋服務為例,我們的格式比較單純些,只是將搜尋用的關鍵字放在 queryString 裡頭。

一般透過 Intent 取得 Data,而 Data 是一種 Uri ,所以需先了解 Uri 的格式,通常 App Links/Deep Link 都是由 Data 中取得所需的資訊。

scheme://host+path?query

電子書搜尋用來做 App Links 的連結來說明:
https://taiwan-ebook-lover.github.io/search?q=亞馬遜

  • scheme = https
  • host = taiwan-ebook-lover.github.io
  • path = /search
  • query = q=亞馬遜

在本例中,我們感興趣的是 queryString,而且是 q 帶的 parameter。
這裡透過 getQueryParameter(key) 取得 QueryParameter,得到 QueryParameter 後再去搜尋這個關鍵字。

val searchKeyword = intent.data.getQueryParameter("q")

第三步驟是可能需要 Web front-end 配合的地方。為了讓連結可以指定顯示特定的 App,需在網站的根目錄下建立 .well-known 資料夾,裡頭放 assetlinks.json 檔案。
完整路徑應該會是: https://your_host.com/.well-known/assetlinks.json

assetlinks.json 檔案可以用 App Links Assistant 快速建立,建立 assetlinks.json 時需要指定 App 的 Application ID,還需要附上 Sign App 金鑰的 SHA256 fingerprint。
除了 App Links Assistant 以外,Google 也有提供相關工具來製作這個檔案。
或者你也能手動取得 Keystore 的 SHA256 fingerprint,只需在 keystore 存放的檔案夾之中,使用終端機下指令:

$ keytool -list -v -keystore [keystore_name].keystore -alias [your_alias] -storepass [your_keystore_pass] -keypass [your_keypass]

在結果之中找到 Certificate Fingerprint,即可以找到 SHA256 hash。

Certificate fingerprints:
SHA1: [your_SHA1_hash]
SHA256: [your_SHA256_hash] << 這一個

如果你將 Android 應用程式簽署的功能開啟,就必須至 Google Play Console 後台查看 SHA-256 Certificate Fingerprint。因為 Google 會在上傳 APK 後,再另外簽過名。

一般來說除了正式版的 App 以為,通常也會幫 debug 版 App 註冊 App Links,assetlinks.json 可以宣告多組的 Application ID 與 Key fingerprint。

大概會是這種長相

最後一步則是測試,大致分為兩個部分。第一個部分是測試 App 對 URL 有反應,第二個部分則是測試 Web 端 ( assetlinks.json)的設定正不正確。

首先需要測試 App 對 URL 有沒有反應,除了很搞剛的在瀏覽器中複製貼上相關 URL 以外,比較輕鬆的方式是透過 adb 傳送 Intent。
這個需要連接上測試的裝置或開啟模擬器,在終端機中輸入:

$ adb shell am start -a android.intent.action.VIEW -d "https://yourhost.com/search?q=test" your.package.name.debug

另一個部分是檢驗丟到 Web 端的 assertlinks.json 有沒有正常工作,我們可以用 Google 提供的 Statement List Generator and Tester 來測試,或是用更土炮的方法:

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://yourhost.com&relation=delegate_permission/common.handle_all_urls

將 yourhost.com 的部分改為設定過 assetlinks.json 的網站位置,如果連結打開顯示出 assetlinks.json 檔案內容,代表一切都準備就緒。

--

--