Universal Link on iOS

什麼是 Universal Link

URL Scheme

眾所周知,從 web 到 app 之間的跳轉可以使用 URL Scheme 的方式實現,但是這種方式存在一定問題:

  • 無法得知跳轉結果:如果 app 沒有安裝導致跳轉失敗,web 端不能知道跳轉是否成功。這樣就無法滿足「如果安裝了 app 就跳轉到 app,否則跳轉到安裝頁面」這樣的需求。也有人通過打開 URL Scheme 鏈接後延遲 1 秒打開下載頁的方式,但用户跳轉到 app 後再切到瀏覽器還是會跳到下載頁,不夠優雅。

  • 系統彈框體驗差:在 iOS 9 之後蘋果在跳轉時會彈出一個提示框問用户是否要打開 app。

  • Web 容器的封鎖:許多 app 為了不給其他 app 導流量,禁用了 URL Scheme 的跳轉。悲劇的是 Universal Link 也被微信封鎖了,想必是一種趨勢。

Universal Link

Universal Link 是 Apple 從 iOS 9 引入的一種打通 web 和 app 之間跳轉的機制。在 Safari 或者 webview 中打開與 app 關聯的鏈接時,會自動跳轉到 app 並且不丟失參數內容。Universal Link 解決了 URL Scheme 的部分問題:

  • 當跳轉失敗時,會直接在 Safari/webview 中打開鏈接。
  • 考慮到眾多 app 都實現了組件化,可以藉助 Universal Link 統一 web 端和 native 的路由。
  • 跳轉時不會彈出提示框,體驗更好。

Universal Link 使用

要使用 Universal Link,要將域名和 app 關聯起來,這個關聯是雙向的:

  • 域名對 app 的認證:在 web 服務器根目錄放一個名為 apple-app-association 的文本文檔,裏面描述哪些路徑會跳轉到哪個 app。具體見 Apple 文檔
  • App 對域名的認證:在 Xcode 裏設置 Associated Domains,將域名添加進去。

注意域名必須通過 HTTPS 訪問 Universal Link 才能生效。

跨域

要通過 Universal Link 實現跳轉有一個前提:必須跨域。比如當你打開一個知乎的 web 頁面時,鏈接是

https://zhihu.com/question/abcd1234

如果頁面中有一個鏈接是:

https://zhihu.com/people/efgh

這個時候是無法跳轉到 app 的(會直接在 Safari 或者 webview 打開頁面)。實際上知乎採用一個專門的二級域名來完成跳轉:

https://oia.zhihu.com/questions/abcd1234

左上角返回

在跳轉到 app 之後,系統狀態欄右上角可以跳轉回瀏覽器,如果用户點擊這裏返回瀏覽器,那麼下次打開 相同路徑 (其他路徑不受影響)就不再跳轉了。這點我並沒有驗證。

更新時機

系統會在 app 初次安裝、升級時去對應的域名下拉 apple-app-association 文檔,如果你的 Universal Link 不工作,而配置都正常的話,可以嘗試重啟手機或重裝 app。

參考

關鍵詞:iOS APP

相關推薦:

從URL輸入到頁面展現,這中間到底發生了什幺?

Support universal links in your iOS app

App extension 總結

web 調起 App? 光知道 scheme 可不夠!

iOS/Android 微信及瀏覽器中喚起本地APP

iOS Universal Links in Xamarin.Forms and ASP.NET Core

H5頁面打開應用的幾種方式

Universal Links: The Web-App Connection

基於 Hexo + GitHub Pages 搭建個人博客(二)

url組成