Deep Link? Universal Link? Dynamic Link?
最近工作上實在是太常被這些名詞所圍繞,往往搞懂了一種另外一種就又被模糊了,趁著這個時候好好搞清楚各種名詞的差異以及使用情境,順便做個筆記提供給需要的人。
先說在 iOS 9 之後,主要以 Universal Link 為主,所以只要先知道 Universal Link 跟 Deep Link 主要的差異在 Universal Link 的長相會是以 https:// 為主,而 Deep Link 的長相會比較像是自定義的 URL Scheme,如果你的手機上剛好有裝 Instagram,你可以在 safari 上打開 instagram:// 就會發現有個提示問你是否要在 Instagram 當中開啟,而 instagram:// 就是 Instagram 自定義的 URL Scheme
Deep Link
翻成中文就是深度連結,可以這樣想,透過與 APP 綁定,而透過 APP 開啟指定的連結,所以會使用 APP 自己所定義的 URL Scheme,如果你的專案裡面有做過類似的設定,那你就會在 info.plist 裡面看到 URL Schemes 這組 key,其所對應的則是該 app 在安裝起來之後,向系統註冊的自定義 URL Scheme,這邊需要注意一個點,因為其是自行向系統來做註冊,回到 Instagram 的例子,如果今天有個人的手機沒有裝 Instagram,又剛好你的 app 註冊的 URL Scheme 是 instagram,而這時候使用者透過 instagram:// 來做開啟時,系統就會開啟你的 app 來做使用。
缺點:
- URL Scheme 容易衝突
- 如果使用的 URL Scheme ,不存在清單當中,此時會顯示連結無效
另外提個題外話,為了要避免連結無效,我們可以在 app 內開啟別人的 URL Scheme 之前,先檢查系統是否有此 URL Scheme 來做註冊,而我們如果要做此檢查,則必須在 info.plist 裡面加上一組 key 為 LSApplicationQueriesSchemes 的白名單,裡面須記錄你要詢問的 URL Scheme 不然透過 UIApplication.shared().canOpenUrl 會都拿到 false
Deferred Deep Link
翻成中文就是延遲深度連結,與上面的 Deep Link 大抵相符,主要的差別是可以把所帶入的參數往後來做使用,可以自己客制這個功能,我如果沒記錯的話,iOS 9 之前可以透過 UIPasteBoard 來做存取,之後則是透過 UserActivity 來做使用,但是我現在找不到相關資料,如果有錯誤歡迎指正。也可以採外第三方的 SDK 來直接使用此服務,例如:AppsFlyer / BranchIO 等等
Universal Link
翻成中文就是通用連結,可以這樣想,因為其與一般的網址共用 https:// 的 protocol,所以如果今天我們訪問的網址,沒有辦法透過 app 來做開啟的時候,就可以直接瀏覽網頁內容,而不會中斷使用者的體驗。
其啟用步驟如下
- 創建 apple-app-site-association 檔案
- 上傳到 Server 的 .well-known 根目錄的資料夾中
- 在 App 內啟用 associated-domain 並且加入 applink:{your_domain}
- 在 AppDelegate 當中去處理收到 NSUserActivity 的事件
因為這篇內容不想談到實作面,僅想針對名詞與想法來做討論,細節可以參考下列官方文件。
缺點:
今天如果使用者沒有安裝 APP,其只能開啟網頁,而不能引導使用者前往 App Store 進行下載。所以有些網頁在你載入的時候,會運行一段 javascript ,其會透過 timer 來計時,如果沒有辦法在特定時間內進行開啟 App,就前往 App Store 進行下載。
這樣的做法其實並不準確,而且在特定版本之後,iOS 的 WebView 即使有進行轉導,其 WebView 的 timer 也不會暫停,所以會發生轉到其他 App 後,又到 App Store 去下載的窘境。
Universal Links 的使用場境僅限 WKWebView / UIWebView / Safari Pages,因此在一些第三方的 WebView 內,可能其有做一些特殊處理,所以會使導頁的功能失效。
而就算可以順利前往 App Store 去進行下載,使用者原先可能要前往特定頁面所帶的參數,在下載 App 開啟後也消失無蹤,會成為資料追蹤上的斷點。
Firebase Dynamic Links
由 Google 推出的動態連結,其建立在 Universal Link 之上,只是多包了一層服務,解決了上述 Deep Link / Universal Link 所提到的問題。
- 針對未安裝 App 的情境,我們可以選擇前往下載頁面或是瀏覽網站
- 若是透過連結進行導下載,其會透過 Firebase 的機制將原先點擊時所傳入的參數,在我們首次開起 App 後一並帶入,解決資料斷點
- 客製化一頁 Preview Page,並且在這頁可以上傳圖片
雖然是建立在 Universal Link 之上,可是其一並解決了,開網頁與導下載的需求,以及實作 Deferred Deep Link 可以把參數往後帶,優化了使用者的體驗與增加轉換率,最後甚至可以透過 Firebase 後台來觀測此連結的使用數據與下載的轉換率等等。
https://firebase.google.com/docs/dynamic-links/ios/receive
以上是我目前針對 Deep Link, Universal Link 的了解,如果有錯誤的地方,歡迎指正:)
生活與工作就是不斷的努力與繼續,一起加油吧!