- 包含Xcode11.0的配置方式和iOS13出現(xiàn)的問題回铛。
什么是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)擊一個(gè)鏈接是可以跳轉(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)然是我們在該鏈接域名根目錄配置過的一個(gè)鏈接靡菇,也可以在該鏈接中放置對應(yīng)的H5頁面。當(dāng)用戶的點(diǎn)擊該鏈接米愿,只要手機(jī)中安裝了支持該鏈接的APP就會直接進(jìn)入到APP中厦凤。如果沒有安裝APP則會跳轉(zhuǎn)到Safari
瀏覽器中,展示H5頁面育苟。對用戶來說則是一個(gè)無縫跳轉(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)一個(gè)不可打開的彈窗)烤礁,而Universal Link
(通用鏈接)本身是一個(gè)HTTPS
鏈接讼积,所以有更好的兼容性肥照; -
安全:當(dāng)用戶的手機(jī)上安裝了你的APP,那么系統(tǒng)會去你配置的網(wǎng)站上去下載你上傳上去的說明文件(這個(gè)說明文件聲明了當(dāng)前該
HTTPS
鏈接可以打開那些APP)勤众。因?yàn)橹挥心阕约翰拍苌蟼魑募侥憔W(wǎng)站的根目錄舆绎,所以你的網(wǎng)站和你的APP之間的關(guān)聯(lián)是安全的; -
可變:當(dāng)用戶手機(jī)上沒有安裝你的APP的時(shí)候们颜,
Universal Link
(通用鏈接)也能夠工作吕朵。如果你愿意,在沒有安裝你的app的時(shí)候窥突,用戶點(diǎn)擊鏈接努溃,會在safari中展示你網(wǎng)站的內(nèi)容; -
簡單:一個(gè)
HTTPS
的鏈接阻问,可以同時(shí)作用于網(wǎng)站和APP梧税; - 私有: 其它APP可以在不需要知道你的APP是否安裝了的情況下和你的APP相互通信。
支持Universal Link
(通用鏈接)
先決條件:必須有一個(gè)支持
HTTPS
的域名称近,并且擁有該域名下的上傳到根目錄的權(quán)限(為了上傳Apple指定文件)第队。-
開發(fā)者中心配置:找到對應(yīng)的App ID,在Application Services列表里有Associated Domains一條刨秆,把它變?yōu)镋nabled就可以了凳谦。
配置App ID支持Associated Domains:
工程配置:
-
Xcode 11.0版本
工程配置中相應(yīng)功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名衡未,也必須必須以applinks:為前綴尸执。
具體步驟如下圖: -
Xcode 11.0以下版本
工程配置中相應(yīng)功能:targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名缓醋,必須以applinks:為前綴如失。
配置項(xiàng)目中的Associated Domains:
-
配置指定文件:創(chuàng)建一個(gè)內(nèi)容為json格式的文件,蘋果將會在合適的時(shí)候改衩,從我們在項(xiàng)目中填入的域名請求這個(gè)文件岖常。這個(gè)文件名必須為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.yourapp’s bundle identifier
竭鞍。如上面的 9JA89QQLNQ就是teamId板惑。登陸開發(fā)者中心,在Account -> Membership里面可以找到Team ID偎快。paths:設(shè)定你的app支持的路徑列表冯乘,只有這些指定的路徑的鏈接,才能被app所處理晒夹。星號的寫法代表了可識 別域名下所有鏈接裆馒。
上傳指定文件:上傳該文件到你的域名所對應(yīng)的根目錄或者.well-known目錄下,這是為了蘋果能獲取到你上傳的文件丐怯。上傳完后,自己先訪問一下,看看是否能夠獲取到喷好,當(dāng)你在瀏覽器中輸入這個(gè)文件鏈接后,應(yīng)該是直接下載apple-app-site-association文件读跷。
Universal Link
(通用鏈接)相關(guān)驗(yàn)證
在iOS設(shè)備中的備忘錄中輸入APP能識別的鏈接梗搅,然后直接點(diǎn)擊此鏈接,就會直接跳轉(zhuǎn)到你的app了效览∥耷校或是長按,在出現(xiàn)的彈出菜單中第二項(xiàng)是在’XXX’中打開丐枉,這也代表著成功:
或是你將要測試的網(wǎng)址在Safari
中打開哆键,在出現(xiàn)的網(wǎng)頁上方下滑,可以看到有在”XX”應(yīng)用中打開:
出現(xiàn)菜單:
當(dāng)點(diǎn)擊某個(gè)鏈接瘦锹,直接可以進(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ā)者噩峦,提供了一個(gè)網(wǎng)頁來驗(yàn)證我們編寫的這個(gè)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
域名不一致時(shí),Universal Link
(通用鏈接)才生效贴妻。
問題匯總
-
按照上面寫的配好了切油,怎么死活打不開呀?名惩?澎胡?
- 支持HTTPS呀,一定要是符合蘋果認(rèn)證的HTTPS證書呀。
- 系統(tǒng)問題攻谁,確保iOS9.0以上
- 配置文件問題稚伍,apple-app-site-association文件中配置的path和測試用的通用鏈接不一致,注意是區(qū)分大小寫的戚宦。
- 域名問題个曙,Xcode中配置的域名一不小心寫錯(cuò)了。
-
為毛有的手機(jī)成功了受楼,有的手機(jī)就不行呢垦搬??艳汽?
- 上面也提到過猴贰,因?yàn)榫W(wǎng)絡(luò)波動有可能會導(dǎo)致部分用戶第一次安裝時(shí),無法下載apple-app-site-association文件骚灸,這個(gè)只能引導(dǎo)用戶刪除重裝或者在迭代時(shí)修改Associated Domains配置告訴系統(tǒng)重新下載apple-app-site-association文件糟趾。
- 另外一種可能是蘋果抽風(fēng)導(dǎo)致,筆者今年年初一碰到過一個(gè)蛋疼的問題甚牲,從中午一直到下午4點(diǎn)發(fā)現(xiàn)重復(fù)的刪除重裝,app也不會請求服務(wù)器的apple-app-site-association文件蝶柿,過了4點(diǎn)之后就好了丈钙。當(dāng)時(shí)因?yàn)闀r(shí)間特殊并沒有深究到底是什么原因?qū)е隆?/li>
-
服務(wù)器換域名了腫么辦?交汤?雏赦?
當(dāng)Associated Domains添加新的 Domains的之后,在app再次啟動的時(shí)候抓包發(fā)現(xiàn)(不需要刪除重裝)芙扎,蘋果會給新添加的這個(gè)Domains發(fā)送一個(gè)請求星岗,請求新Domain下的apple-app-site-association文件。也就是說Associated Domains發(fā)生改變的話戒洼,系統(tǒng)是會知道的俏橘,這樣就可以在迭代的時(shí)候刪除舊的域名,添加新的域名了圈浇。
另外Domains的配置也可以使用通配符寥掐,例如:applinks:*.mywebsite.com
-
全都配置好了,項(xiàng)目也能喚起來了磷蜀,web頁面到底該怎么弄呀召耘??褐隆?通用鏈接指向的服務(wù)器的頁面到底應(yīng)該是哪個(gè)污它?
之前iOS和安卓用的是同一個(gè)網(wǎng)頁,也就是說從APP內(nèi)分享出去的網(wǎng)頁,可以被蘋果用戶和安卓用戶同時(shí)查看衫贬,在這里需要由web童鞋使用js判斷當(dāng)前所處的平臺以及其系統(tǒng)蜜宪。
如果是安卓用戶,則顯示安卓相關(guān)提示頁面祥山。
如果是蘋果用戶圃验,那么分兩種:
- 如果是9.0以上的系統(tǒng),相關(guān)的“在APP內(nèi)打開”按鈕的鏈接配置的就是我們的
Universal Link
(通用鏈接)了缝呕,且該通用鏈接地址指向的是一個(gè)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ā)一個(gè)跳轉(zhuǎn)到我們APP
URL Scheme
的重定向,以實(shí)現(xiàn)在Safari
中喚醒我們的APP源祈。
- 如果是9.0以上的系統(tǒng),相關(guān)的“在APP內(nèi)打開”按鈕的鏈接配置的就是我們的
當(dāng)使用通用鏈接喚醒APP之后煎源,手機(jī)右上角有一個(gè)小按鈕?
那個(gè)小按鈕只有(在iOS10.0以下才有)是可以引導(dǎo)用戶跳轉(zhuǎn)到Safari
中香缺,名字叫bread crumbs button
(面包屑)手销,當(dāng)然也去不掉;并且當(dāng)用戶點(diǎn)過這個(gè)按鈕后,再點(diǎn)擊Universal Link
(通用鏈接)不會直接打開對應(yīng)的APP图张。-
備忘錄和safari中都可以打開app锋拖,怎么分享到其他app里面就不行了?
未跨域?qū)е碌幕雎郑纾悍窒淼轿⑿诺逆溄邮?code>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
(通用鏈接)iOS13中在safari中可以打開相應(yīng)APP鄙陡,但是從微信或其他APP中點(diǎn)擊去safari怎么就打開了別的APP?
在iOS13之前在其他APP去safari中打開Universal Link
(通用鏈接)系統(tǒng)匹配域名是全匹配躏啰,而在iOS13之后規(guī)則發(fā)生了變化趁矾,猜測是包含關(guān)系。比如在iOS13之前给僵,如果Universal Link
(通用鏈接)為w.mydomain.com
那么在微信或者其他APP訪問www.mydomain.com
然后點(diǎn)擊去safari打開則不會拉起相應(yīng)APP,而在iOS13則會拉起相應(yīng)APP毫捣。
而在safari中輸入的鏈接則依然和iOS之前一樣详拙,只有www.mydomain.com
才會提示打開相應(yīng)APP。
參考鏈接:
- 官方文檔
- 蘋果驗(yàn)證通用鏈接是否可用的網(wǎng)站
- 通用鏈接文件存放的server需要支持HTTPS蘋果支持的HTTPS證書列表
文章若有不對地方蔓同,歡迎批評指正
作者:CodeRookie
鏈接:http://www.reibang.com/p/ab50bdaec65d