Created by Shuimu
什么是 Universal Link
Universal Link
是 Apple 在 iOS9 推出的一種能夠方便的通過傳統(tǒng) HTTPS
鏈接來啟動 APP 的功能镣隶,可以使用相同的網(wǎng)址打開網(wǎng)址和 APP 供嚎。當(dāng)你的應(yīng)用支持 Universal Link
桥氏,當(dāng)用戶點(diǎn)擊一個鏈接是可以跳轉(zhuǎn)到你的網(wǎng)站并獲得無縫重定向到對應(yīng)的APP俗他,且不需要通過 Safari
瀏覽器挠铲。如果你的應(yīng)用不支持的話见秤,則會在 Safari
中打開該鏈接抑党。在蘋果開發(fā)者中可以看到對它的介紹是:
Seamlessly link to content inside your app, or on your website in iOS 9 or later. With universal links, you can always give users the most integrated mobile experience, even when your app isn’t installed on their device.
如何理解 Universal Link
Universal Link
:看起來就是一條普通的 https
鏈接崎脉,當(dāng)然是我們在該鏈接域名根目錄配置過的一個鏈接,也可以在該鏈接中放置對應(yīng)的 H5 頁面图甜。當(dāng)用戶的點(diǎn)擊該鏈接碍粥,只要手機(jī)中安裝了支持該鏈接的 APP 就會直接進(jìn)入到 APP 中。如果沒有安裝 APP 則會跳轉(zhuǎn)到 Safari
瀏覽器中黑毅,展示 H5 頁面嚼摩。對用戶來說則是一個無縫跳轉(zhuǎn)的過程。
Universal Link 的應(yīng)用場景
使用 Universal Link
可以讓用戶在 Safari
瀏覽器或者其他 APP 的 webview
中拉起相應(yīng)的 APP 矿瘦,也可以在 APP 中使用相應(yīng)的功能枕面,從而來把用戶引流到 APP 中。比如淘寶當(dāng)在 Safari
瀏覽器中進(jìn)入淘寶網(wǎng)頁點(diǎn)擊打開 APP 則會使用 Universal Link
來拉起淘寶 APP缚去。
使用 Universal Link 跳轉(zhuǎn)的好處
-
唯一性:不像自定義的
URL Scheme
潮秘,因?yàn)樗褂脴?biāo)準(zhǔn)的HTTPS
協(xié)議鏈接到你的 web 站點(diǎn),所以一般不會被其它的 APP 所聲明病游。另外唇跨,URL scheme
因?yàn)槭亲远x的協(xié)議,所以在沒有安裝 app 的情況下是無法直接打開的(在Safari
中還會出現(xiàn)一個不可打開的彈窗)衬衬,而Universal Link
本身是一個HTTPS
鏈接买猖,所以有更好的兼容性; -
安全:當(dāng)用戶的手機(jī)上安裝了你的 APP滋尉,那么系統(tǒng)會去你配置的網(wǎng)站上去下載你上傳上去的說明文件(這個說明文件聲明了當(dāng)前該
HTTPS
鏈接可以打開那些 APP )玉控。因?yàn)橹挥心阕约翰拍苌蟼魑募侥憔W(wǎng)站的根目錄,所以你的網(wǎng)站和你的 APP 之間的關(guān)聯(lián)是安全的狮惜; -
可變:當(dāng)用戶手機(jī)上沒有安裝你的 APP 的時候高诺,
Universal Link
也能夠工作。如果你愿意碾篡,在沒有安裝你的 app 的時候虱而,用戶點(diǎn)擊鏈接,會在Safari
中展示你網(wǎng)站的內(nèi)容开泽; -
簡單:一個
HTTPS
的鏈接牡拇,可以同時作用于網(wǎng)站和 APP ; - 私有:其它 APP 可以在不需要知道你的 APP 是否安裝了的情況下和你的 APP 相互通信穆律。
支持 Universal Link
先決條件:必須有一個支持
HTTPS
的域名惠呼,并且擁有該域名下的上傳到根目錄的權(quán)限(為了上傳 Apple 指定文件apple-app-site-association
)。開發(fā)者中心配置:找到對應(yīng)的
App ID
峦耘,在Application Services
列表里有Associated Domains
一項(xiàng)剔蹋,把它變?yōu)?Enabled
就可以了。-
工程配置
-
Xcode 11.0 版本
工程配置中相應(yīng)功能:
targets
->Signing&Capabilites
->Capability
->Associated Domains
辅髓,在其中的Domains
中填入你想支持的域名泣崩,也必須必須以applinks:
為前綴少梁。 -
Xcode 11.0 以下版本
工程配置中相應(yīng)功能:
targets
->Capabilites
->Associated Domains
,在其中的Domains
中填入你想支持的域名律想,必須以applinks:
為前綴猎莲。
-
配置指定文件:創(chuàng)建一個內(nèi)容為 json 格式的文件,蘋果將會在合適的時候技即,從我們在項(xiàng)目中填入的域名請求這個文件著洼。這個文件名必須為
apple-app-site-association
,切記沒有后綴名而叼,文件內(nèi)容大概是這樣子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [
"/wwdc/news/",
"/videos/wwdc/2015/*"
]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [
"*"
]
}
]
}
}
**說明**:
> `appID` :組成方式是 `TeamID.your app’s bundle identifier` 身笤。如上面的 `9JA89QQLNQ` 就是 `TeamID` 。登陸開發(fā)者中心葵陵,在 `Account` -> `Membership` 里面可以找到 `Team ID` 液荸。
> `paths` :設(shè)定你的 app 支持的路徑列表,只有這些指定的路徑的鏈接脱篙,才能被 app 所處理娇钱。星號的寫法代表了可識別域名下所有鏈接。
-
上傳指定文件:上傳該文件到你的域名所對應(yīng)的根目錄或者
.well-known
目錄下绊困,這是為了蘋果能獲取到你上傳的文件文搂。上傳完后,自己先訪問一下秤朗,看看是否能夠獲取到煤蹭,當(dāng)你在瀏覽器中輸入這個文件鏈接后,應(yīng)該是直接下載apple-app-site-association
文件取视。
Universal Link 相關(guān)驗(yàn)證
在 iOS 設(shè)備中的備忘錄中輸入 APP 能識別的鏈接硝皂,然后直接點(diǎn)擊此鏈接,就會直接跳轉(zhuǎn)到你的 app 了作谭』铮或是長按,在彈出的菜單中出現(xiàn)在 “XXX”中打開
折欠,這也代表著成功姨裸。
或是你將要測試的網(wǎng)址在 Safari
中打開,在出現(xiàn)的網(wǎng)頁上方下滑怨酝,可以看到有在“XX”應(yīng)用中打開
當(dāng)點(diǎn)擊某個鏈接,直接可以進(jìn)我們的 app 了那先,但是我們的目的是要能夠獲取到用戶進(jìn)來的鏈接农猬,根據(jù)鏈接來展示給用戶相應(yīng)的內(nèi)容。
我們需要在工程里的實(shí)現(xiàn) AppDelegate
里對應(yīng)的方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
{
NSURL *url = userActivity.webpageURL;
if (url是我們希望處理的) {
// 進(jìn)行我們的處理
} else {
[[UIApplication sharedApplication] openURL:url];
}
}
return YES;
}
蘋果為了方便開發(fā)者售淡,提供了一個網(wǎng)頁來驗(yàn)證我們編寫的這個 apple-app-site-association
是否合法有效斤葱,進(jìn)入驗(yàn)證網(wǎng)址進(jìn)行驗(yàn)證:
注意
前端開發(fā)經(jīng)常面臨跨域問題慷垮,必須要求跨域,如果不跨域揍堕,就不行料身。
只有當(dāng)前 webview
的 URL
域名,與跳轉(zhuǎn)目標(biāo) URL
域名不一致時衩茸,Universal Link
才生效芹血。
問題匯總
-
按照上面寫的配好了,怎么死活打不開呀楞慈?幔烛??
支持HTTPS呀囊蓝,一定要是符合蘋果認(rèn)證的HTTPS證書呀饿悬。
系統(tǒng)問題,確保iOS9.0以上
配置文件問題聚霜,apple-app-site-association文件中配置的path和測試用的通用鏈接不一致狡恬,注意是區(qū)分大小寫的。
域名問題蝎宇,Xcode中配置的域名一不小心寫錯了弟劲。
-
為毛有的手機(jī)成功了,有的手機(jī)就不行呢夫啊?函卒??
上面也提到過撇眯,因?yàn)榫W(wǎng)絡(luò)波動有可能會導(dǎo)致部分用戶第一次安裝時报嵌,無法下載apple-app-site-association文件,這個只能引導(dǎo)用戶刪除重裝或者在迭代時修改Associated Domains配置告訴系統(tǒng)重新下載apple-app-site-association文件熊榛。
另外一種可能是蘋果抽風(fēng)導(dǎo)致锚国,筆者今年年初一碰到過一個蛋疼的問題,從中午一直到下午4點(diǎn)發(fā)現(xiàn)重復(fù)的刪除重裝玄坦,app也不會請求服務(wù)器的apple-app-site-association文件血筑,過了4點(diǎn)之后就好了。當(dāng)時因?yàn)闀r間特殊并沒有深究到底是什么原因?qū)е隆?/p>
-
服務(wù)器換域名了腫么辦煎楣?豺总??
當(dāng)Associated Domains添加新的 Domains的之后择懂,在app再次啟動的時候抓包發(fā)現(xiàn)(不需要刪除重裝)喻喳,蘋果會給新添加的這個Domains發(fā)送一個請求,請求新Domain下的apple-app-site-association文件困曙。
也就是說Associated Domains發(fā)生改變的話表伦,系統(tǒng)是會知道的谦去,這樣就可以在迭代的時候刪除舊的域名,添加新的域名了蹦哼。
另外Domains的配置也可以使用通配符鳄哭,例如:
applinks:*.mywebsite.com
-
全都配置好了,項(xiàng)目也能喚起來了纲熏,web頁面到底該怎么弄呀妆丘??赤套?通用鏈接指向的服務(wù)器的頁面到底應(yīng)該是哪個飘痛?
之前iOS和安卓用的是同一個網(wǎng)頁,也就是說從APP內(nèi)分享出去的網(wǎng)頁容握,可以被蘋果用戶和安卓用戶同時查看宣脉,在這里需要由web童鞋使用js判斷當(dāng)前所處的平臺以及其系統(tǒng)。
如果是安卓用戶剔氏,則顯示安卓相關(guān)提示頁面塑猖。
如果是蘋果用戶,那么分兩種:
如果是 9.0 以上的系統(tǒng)谈跛,相關(guān)的
“在 APP 內(nèi)打開”
按鈕的鏈接配置的就是我們的Universal Link
了羊苟,且該通用鏈接地址指向的是一個 APP 下載引導(dǎo)頁面,那么當(dāng)用戶安裝了 APP 感憾,即可通過通用鏈接喚醒 APP 蜡励;如果用戶沒有安裝 app ,那么就會跳轉(zhuǎn)到通用鏈接指向的 APP 下載引導(dǎo)頁面阻桅,達(dá)到最大化的客戶導(dǎo)流凉倚。如果是 9.0 以下的系統(tǒng),則相應(yīng)的
“在APP內(nèi)打開”
的按鈕就會發(fā)一個跳轉(zhuǎn)到我們 APPURL Scheme
的重定向嫂沉,以實(shí)現(xiàn)在Safari
中喚醒我們的 APP稽寒。
-
當(dāng)使用通用鏈接喚醒APP之后,手機(jī)右上角有一個小按鈕趟章?
那個小按鈕只有(在 iOS 10.0 以下才有)是可以引導(dǎo)用戶跳轉(zhuǎn)到
Safari
中杏糙,名字叫bread crumbs button
(面包屑),當(dāng)然也去不掉蚓土;并且當(dāng)用戶點(diǎn)過這個按鈕后宏侍,再點(diǎn)擊Universal Link
不會直接打開對應(yīng)的 APP。 -
備忘錄和 Safari 中都可以打開 app蜀漆,怎么分享到其他 app 里面就不行了负芋?
未跨域?qū)е碌模纾悍窒淼轿⑿诺逆溄邮?
https://www.mydomain.com/share.html
,然后該網(wǎng)頁中的“在app內(nèi)打開”
按鈕配置的通用鏈接為https://www.mydomain.com/index.html
旧蛾。跨域的意思是說,
通用鏈接
和調(diào)用通用鏈接的網(wǎng)頁
不要使用同一域名蠕嫁。即如果通用鏈接域名為
www.mydomain.com
锨天,則通用鏈接所處的網(wǎng)頁域名就不能是www.mydomain.com
。 微信已經(jīng)禁用了
Universal Link
(待考證)-
iOS 13 中在 safari 中可以打開相應(yīng) APP 剃毒,但是從微信或其他 APP 中點(diǎn)擊去 safari 怎么就打開了別的 APP 病袄?
在 iOS 13 之前在其他 APP 去 Safari中打開
Universal Link
系統(tǒng)匹配域名是全匹配,而在 iOS 13 之后規(guī)則發(fā)生了變化赘阀,猜測是包含關(guān)系益缠。比如在 iOS 13 之前,如果Universal Link
為w.mydomain.com
基公,那么在微信或者其他 APP 訪問www.mydomain.com
然后點(diǎn)擊去 Safari 打開則不會拉起相應(yīng) APP 幅慌,而在 iOS 13 則會拉起相應(yīng) APP 。而在 Safari 中輸入的鏈接則依然和 iOS 之前一樣轰豆,只有
w.mydomain.com
才會提示打開相應(yīng) APP 胰伍。
參考鏈接:
Universal Link 文件存放的 server 需要支持 HTTPS 蘋果支持的 HTTPS 證書列表