1、schema
現在線上大多數 App 使用的就是 schema 跳轉,都對應一套路由法則,基本都能做到跳轉到 App 內任一界面。
location.href?=?'schema://xxxx'
但 schema 有個弊端:
iOS中,如果用戶沒有安裝App,那么他一定會經歷2個事情:
1、schema打開app,但是失敗,延遲后,跳轉下載App
2、跳轉下載App之前schema會彈個可惡的跳轉失敗的框,然后再延遲后彈跳轉AppStore的框
再就是 schema 被微信等應用禁止跳轉了。
2、Universal Link
Universal Link和 schema 一樣,目前還未被微信等禁止,也不會彈出跳轉失敗的彈出框。
Universal Link實現過程
1、一個支持 SSL 訪問的域名,且不能是自建證書的 https 域名
2、新建一個apple-app-site-association文件,上傳到域名根目錄下,或 .well-known 文件夾下,
apple-app-site-association文件內容是一個 json
{
"applinks":
{
"apps":[],
"details":[
{
"appID":"ABCDEFG.com.aaa.bbb.ccc",
"paths":["NOT /aaaa/*","/iosuniversallink/*"]
},
{
"appID":"GFEDCBA.com.aaa.bbb.ccc",
"paths":["NOT /aaaa/*","/iosuniversallink/*"]
}
]
}
}
appId 為 teamId + boundleId
paths 為域名下可識別或不可識別的 path 路徑, 如 https://www.xxx.com/iosuniversallink/*, 就可以喚起 app, 而 https://www.xxx.com/aaaa/xxxxx則直接跳轉到 web 頁了。
注意:該文件沒有后綴名
附:鏈家 json 文件:https://linkm.lianjia.com/apple-app-site-association
知乎 json 文件:https://oia.zhihu.com/apple-app-site-association
3、配置iOS App工程
開發者中心證書打開Associated Domains
工程配置Associated Domains
將你apple-app-site-association所在域名配置進去
給你的工程像Schema的OpenUrl一樣,編寫App被喚醒后的處理邏輯
4、Universal Link的基本運作流程
APP第一次啟動 or APP更新版本后第一次啟動
APP向工程里配置的域名發起Get請求拉取apple-app-association Json File
APP將apple-app-association注冊給系統
由任意webview發起跳轉的url,如果命中了apple-app-association注冊過的通用鏈接
打開App,觸發Universal Link delegate
沒命中,webview繼續跳轉url
在你進行apple-app-association 以及 App工程的配置之后,整個Universal Link的運作流程完全由系統控制了
Universal Link 跨域
Universal Link有跨域問題,Universal Link必須要求跨域,如果不跨域,就不行,就失效,就不工作。(iOS 9.2之后的改動)
假如當前網頁的域名是 A
當前網頁發起跳轉的域名是 B
必須要求 B 和 A 是不同域名,才會觸發Universal Link
如果B 和 A 是相同域名,只會繼續在當前WebView里面進行跳轉,哪怕你的Universal Link一切正常,根本不會打開App
產品需求
如果已安裝App,跳轉對應界面
如果沒安裝App,跳轉App下載界面
已安裝App
打開App 觸發handleUniversalLink
走到/_iosuniversallink/分支,拼接出任意App內的界面路由
跳轉界面
未安裝App
WebView原地跳轉https://xxx.xxx.xxx/_iosuniversallink/*
命中服務器的重定向邏輯
重定向到AppStore跳轉頁面
打開AppStore下載
如果已安裝App,跳轉對應界面
如果沒安裝App,跳轉App下載界面
解決了舊Schema模式下的弊端問題:
Schema無法判斷是否安裝App,只能采用setTimeout的Trick方式
Schema的Trick方式會有一個丑陋的錯誤跳轉彈框
Schema無法在微信/手百等App內,打開我們自己的App
簡單的說,這樣設計的初衷就是,我不為了通用鏈接這一目的來使用Universal Link,來統一WAP&APP的URL跳轉,我就為了把Universal Link當做加強版Schema來使用