包含Xcode11.0的配置方式和iOS13出現(xiàn)的問(wèn)題。
什么是Universal Link(通用鏈接)
Universal Link(通用鏈接)是Apple在iOS9推出的一種能夠方便的通過(guò)傳統(tǒng)HTTPS鏈接來(lái)啟動(dòng)APP的功能,可以使用相同的網(wǎng)址打開(kāi)網(wǎng)址和APP由蘑。當(dāng)你的應(yīng)用支持Universal Link(通用鏈接),當(dāng)用戶點(diǎn)擊一個(gè)鏈接是可以跳轉(zhuǎn)到你的網(wǎng)站并獲得無(wú)縫重定向到對(duì)應(yīng)的APP汁针,且不需要通過(guò)Safari瀏覽器碗旅。如果你的應(yīng)用不支持的話,則會(huì)在Safari中打開(kāi)該鏈接棠笑。在蘋果開(kāi)發(fā)者中可以看到對(duì)它的介紹是:
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(通用鏈接):看起來(lái)就是一條普通的https鏈接梦碗,當(dāng)然是我們?cè)谠撴溄佑蛎夸浥渲眠^(guò)的一個(gè)鏈接,也可以在該鏈接中放置對(duì)應(yīng)的H5頁(yè)面蓖救。當(dāng)用戶的點(diǎn)擊該鏈接洪规,只要手機(jī)中安裝了支持該鏈接的APP就會(huì)直接進(jìn)入到APP中。如果沒(méi)有安裝APP則會(huì)跳轉(zhuǎn)到Safari瀏覽器中循捺,展示H5頁(yè)面斩例。對(duì)用戶來(lái)說(shuō)則是一個(gè)無(wú)縫跳轉(zhuǎn)的過(guò)程。
Universal Link(通用鏈接)的應(yīng)用場(chǎng)景
使用Universal Link(通用鏈接)可以讓用戶在Safari瀏覽器或者其他APP的webview中拉起相應(yīng)的APP从橘,也可以在APP中使用相應(yīng)的功能念赶,從而來(lái)把用戶引流到APP中础钠。比如淘寶當(dāng)在Safari瀏覽器中進(jìn)入淘寶網(wǎng)頁(yè)點(diǎn)擊打開(kāi)APP則會(huì)使用Universal Link(通用鏈接)來(lái)拉起淘寶APP。
使用Universal Link(通用鏈接)跳轉(zhuǎn)的好處
唯一性: 不像自定義的URL Scheme叉谜,因?yàn)樗褂脴?biāo)準(zhǔn)的HTTPS協(xié)議鏈接到你的web站點(diǎn)旗吁,所以一般不會(huì)被其它的APP所聲明。另外停局,URL scheme因?yàn)槭亲远x的協(xié)議很钓,所以在沒(méi)有安裝 app 的情況下是無(wú)法直接打開(kāi)的(在Safari中還會(huì)出現(xiàn)一個(gè)不可打開(kāi)的彈窗),而Universal Link(通用鏈接)本身是一個(gè)HTTPS鏈接董栽,所以有更好的兼容性码倦;
安全:當(dāng)用戶的手機(jī)上安裝了你的APP,那么系統(tǒng)會(huì)去你配置的網(wǎng)站上去下載你上傳上去的說(shuō)明文件(這個(gè)說(shuō)明文件聲明了當(dāng)前該HTTPS鏈接可以打開(kāi)那些APP)裆泳。因?yàn)橹挥心阕约翰拍苌蟼魑募侥憔W(wǎng)站的根目錄叹洲,所以你的網(wǎng)站和你的APP之間的關(guān)聯(lián)是安全的柠硕;
可變:當(dāng)用戶手機(jī)上沒(méi)有安裝你的APP的時(shí)候工禾,Universal Link(通用鏈接)也能夠工作。如果你愿意蝗柔,在沒(méi)有安裝你的app的時(shí)候闻葵,用戶點(diǎn)擊鏈接,會(huì)在safari中展示你網(wǎng)站的內(nèi)容癣丧;
簡(jiǎn)單:一個(gè)HTTPS的鏈接槽畔,可以同時(shí)作用于網(wǎng)站和APP;
私有: 其它APP可以在不需要知道你的APP是否安裝了的情況下和你的APP相互通信胁编。
支持Universal Link(通用鏈接)
先決條件:必須有一個(gè)支持HTTPS的域名厢钧,并且擁有該域名下的上傳到根目錄的權(quán)限(為了上傳Apple指定文件)。
開(kāi)發(fā)者中心配置:找到對(duì)應(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格式的文件粪滤,蘋果將會(huì)在合適的時(shí)候斧拍,從我們?cè)陧?xiàng)目中填入的域名請(qǐng)求這個(gè)文件。這個(gè)文件名必須為apple-app-site-association杖小,切記沒(méi)有后綴名肆汹,文件內(nèi)容大概是這樣子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "" ]
}
]
}
}
說(shuō)明:
appID:組成方式是 teamId.yourapp’s bundle identifier怕吴。如上面的 9JA89QQLNQ就是teamId。登陸開(kāi)發(fā)者中心县踢,在Account -> Membership里面可以找到Team ID转绷。
paths:設(shè)定你的app支持的路徑列表,只有這些指定的路徑的鏈接硼啤,才能被app所處理议经。星號(hào)的寫法代表了可識(shí) 別域名下所有鏈接。
上傳指定文件:上傳該文件到你的域名所對(duì)應(yīng)的根目錄或者.well-known目錄下谴返,這是為了蘋果能獲取到你上傳的文件煞肾。上傳完后,自己先訪問(wèn)一下,看看是否能夠獲取到,當(dāng)你在瀏覽器中輸入這個(gè)文件鏈接后嗓袱,應(yīng)該是直接下載apple-app-site-association文件籍救。
Universal Link(通用鏈接)相關(guān)驗(yàn)證
在iOS設(shè)備中的備忘錄中輸入APP能識(shí)別的鏈接,然后直接點(diǎn)擊此鏈接渠抹,就會(huì)直接跳轉(zhuǎn)到你的app了蝙昙。或是長(zhǎng)按梧却,在出現(xiàn)的彈出菜單中第二項(xiàng)是在’XXX’中打開(kāi)奇颠,這也代表著成功:
或是你將要測(cè)試的網(wǎng)址在Safari中打開(kāi),在出現(xiàn)的網(wǎng)頁(yè)上方下滑放航,可以看到有在”XX”應(yīng)用中打開(kāi):
出現(xiàn)菜單:
當(dāng)點(diǎn)擊某個(gè)鏈接烈拒,直接可以進(jìn)我們的app了,但是我們的目的是要能夠獲取到用戶進(jìn)來(lái)的鏈接广鳍,根據(jù)鏈接來(lái)展示給用戶相應(yīng)的內(nèi)容荆几。
我們需要在工程里的實(shí)現(xiàn)AppDelegate里對(duì)應(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;
}
蘋果為了方便開(kāi)發(fā)者,提供了一個(gè)網(wǎng)頁(yè)來(lái)驗(yàn)證我們編寫的這個(gè)apple-app-site-association是否合法有效赊时,進(jìn)入驗(yàn)證網(wǎng)址進(jìn)行驗(yàn)證:
注意
前端開(kāi)發(fā)經(jīng)常面臨跨域問(wèn)題吨铸,必須要求跨域,如果不跨域蛋叼,就不行焊傅。
只有當(dāng)前webview的URL域名,與跳轉(zhuǎn)目標(biāo)URL域名不一致時(shí)狈涮,Universal Link(通用鏈接)才生效狐胎。
問(wèn)題匯總
按照上面寫的配好了,怎么死活打不開(kāi)呀歌馍?握巢??
支持HTTPS呀松却,一定要是符合蘋果認(rèn)證的HTTPS證書呀暴浦。
系統(tǒng)問(wèn)題溅话,確保iOS9.0以上
配置文件問(wèn)題,apple-app-site-association文件中配置的path和測(cè)試用的通用鏈接不一致歌焦,注意是區(qū)分大小寫的飞几。
域名問(wèn)題,Xcode中配置的域名一不小心寫錯(cuò)了独撇。
為毛有的手機(jī)成功了屑墨,有的手機(jī)就不行呢?纷铣?卵史?
上面也提到過(guò),因?yàn)榫W(wǎng)絡(luò)波動(dòng)有可能會(huì)導(dǎo)致部分用戶第一次安裝時(shí)搜立,無(wú)法下載apple-app-site-association文件以躯,這個(gè)只能引導(dǎo)用戶刪除重裝或者在迭代時(shí)修改Associated Domains配置告訴系統(tǒng)重新下載apple-app-site-association文件。
另外一種可能是蘋果抽風(fēng)導(dǎo)致啄踊,筆者今年年初一碰到過(guò)一個(gè)蛋疼的問(wèn)題忧设,從中午一直到下午4點(diǎn)發(fā)現(xiàn)重復(fù)的刪除重裝,app也不會(huì)請(qǐng)求服務(wù)器的apple-app-site-association文件社痛,過(guò)了4點(diǎn)之后就好了见转。當(dāng)時(shí)因?yàn)闀r(shí)間特殊并沒(méi)有深究到底是什么原因?qū)е隆?br>
服務(wù)器換域名了腫么辦?蒜哀??
當(dāng)Associated Domains添加新的 Domains的之后吏砂,在app再次啟動(dòng)的時(shí)候抓包發(fā)現(xiàn)(不需要?jiǎng)h除重裝)撵儿,蘋果會(huì)給新添加的這個(gè)Domains發(fā)送一個(gè)請(qǐng)求,請(qǐng)求新Domain下的apple-app-site-association文件狐血。
也就是說(shuō)Associated Domains發(fā)生改變的話淀歇,系統(tǒng)是會(huì)知道的,這樣就可以在迭代的時(shí)候刪除舊的域名匈织,添加新的域名了浪默。
另外Domains的配置也可以使用通配符,例如:applinks:*.mywebsite.com
全都配置好了缀匕,項(xiàng)目也能喚起來(lái)了纳决,web頁(yè)面到底該怎么弄呀?乡小?阔加?通用鏈接指向的服務(wù)器的頁(yè)面到底應(yīng)該是哪個(gè)?
之前iOS和安卓用的是同一個(gè)網(wǎng)頁(yè)满钟,也就是說(shuō)從APP內(nèi)分享出去的網(wǎng)頁(yè)胜榔,可以被蘋果用戶和安卓用戶同時(shí)查看胳喷,在這里需要由web童鞋使用js判斷當(dāng)前所處的平臺(tái)以及其系統(tǒng)。
如果是安卓用戶夭织,則顯示安卓相關(guān)提示頁(yè)面吭露。
如果是蘋果用戶,那么分兩種:
如果是9.0以上的系統(tǒng)尊惰,相關(guān)的“在APP內(nèi)打開(kāi)”按鈕的鏈接配置的就是我們的Universal Link(通用鏈接)了奴饮,且該通用鏈接地址指向的是一個(gè)APP下載引導(dǎo)頁(yè)面,那么當(dāng)用戶安裝了APP择浊,即可通過(guò)通用鏈接喚醒APP戴卜;如果用戶沒(méi)有安裝app,那么就會(huì)跳轉(zhuǎn)到通用鏈接指向的APP下載引導(dǎo)頁(yè)面琢岩,達(dá)到最大化的客戶導(dǎo)流投剥。
如果是9.0以下的系統(tǒng),則相應(yīng)的 “在APP內(nèi)打開(kāi)”的按鈕就會(huì)發(fā)一個(gè)跳轉(zhuǎn)到我們APP URL Scheme的重定向担孔,以實(shí)現(xiàn)在Safari中喚醒我們的APP江锨。
當(dāng)使用通用鏈接喚醒APP之后,手機(jī)右上角有一個(gè)小按鈕糕篇?
那個(gè)小按鈕只有(在iOS10.0以下才有)是可以引導(dǎo)用戶跳轉(zhuǎn)到Safari中啄育,名字叫bread crumbs button(面包屑),當(dāng)然也去不掉;并且當(dāng)用戶點(diǎn)過(guò)這個(gè)按鈕后拌消,再點(diǎn)擊Universal Link(通用鏈接)不會(huì)直接打開(kāi)對(duì)應(yīng)的APP挑豌。
備忘錄和safari中都可以打開(kāi)app,怎么分享到其他app里面就不行了墩崩?
未跨域?qū)е碌拿ビⅲ纾悍窒淼轿⑿诺逆溄邮?a target="_blank">https://www.mydomain.com/share.html,然后該網(wǎng)頁(yè)中的“在app內(nèi)打開(kāi)”按鈕配置的通用鏈接為https://www.mydomain.com/index.html鹦筹。
跨域的意思是說(shuō)铝阐,通用鏈接 和 調(diào)用通用鏈接的網(wǎng)頁(yè)不要使用同一域名。
即如果通用鏈接域名為www.mydomain.com铐拐,則通用鏈接所處的網(wǎng)頁(yè)域名就不能是www.mydomain.com徘键。
微信已經(jīng)禁用了Universal Link(通用鏈接)
iOS13中在safari中可以打開(kāi)相應(yīng)APP,但是從微信或其他APP中點(diǎn)擊去safari怎么就打開(kāi)了別的APP遍蟋?
在iOS13之前在其他APP去safari中打開(kāi)Universal Link(通用鏈接)系統(tǒng)匹配域名是全匹配吹害,而在iOS13之后規(guī)則發(fā)生了變化,猜測(cè)是包含關(guān)系匿值。比如在iOS13之前赠制,如果Universal Link(通用鏈接)為w.mydomain.com那么在微信或者其他APP訪問(wèn)www.mydomain.com然后點(diǎn)擊去safari打開(kāi)則不會(huì)拉起相應(yīng)APP,而在iOS13則會(huì)拉起相應(yīng)APP。
而在safari中輸入的鏈接則依然和iOS之前一樣,只有www.mydomain.com才會(huì)提示打開(kāi)相應(yīng)APP钟些。