iOS 喚起APP之Universal Link(通用鏈接)

包含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钟些。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烟号,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子政恍,更是在濱河造成了極大的恐慌汪拥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙耗,死亡現(xiàn)場(chǎng)離奇詭異迫筑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宗弯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門脯燃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蒙保,你說(shuō)我怎么就攤上這事辕棚。” “怎么了邓厕?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逝嚎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我详恼,道長(zhǎng)补君,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任昧互,我火速辦了婚禮挽铁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硅堆。我一直安慰自己屿储,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布渐逃。 她就那樣靜靜地躺著,像睡著了一般民褂。 火紅的嫁衣襯著肌膚如雪茄菊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天赊堪,我揣著相機(jī)與錄音面殖,去河邊找鬼。 笑死哭廉,一個(gè)胖子當(dāng)著我的面吹牛脊僚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辽幌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼增淹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乌企,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虑润,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后加酵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拳喻,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年猪腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冗澈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陋葡,死狀恐怖亚亲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脖岛,我是刑警寧澤朵栖,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柴梆,受9級(jí)特大地震影響陨溅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绍在,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一门扇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偿渡,春花似錦臼寄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至适揉,卻和暖如春留攒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫉嘀。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工炼邀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剪侮。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓拭宁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杰标,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容