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

  • 包含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(通用鏈接)

  1. 先決條件:必須有一個(gè)支持HTTPS的域名称近,并且擁有該域名下的上傳到根目錄的權(quán)限(為了上傳Apple指定文件)第队。

  2. 開發(fā)者中心配置:找到對應(yīng)的App ID,在Application Services列表里有Associated Domains一條刨秆,把它變?yōu)镋nabled就可以了凳谦。

    配置App ID支持Associated Domains:

  3. 工程配置:

  • 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:

  1. 配置指定文件:創(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所處理晒夹。星號的寫法代表了可識 別域名下所有鏈接裆馒。

  2. 上傳指定文件:上傳該文件到你的域名所對應(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)前webviewURL域名凭涂,與跳轉(zhuǎn)目標(biāo)URL域名不一致時(shí),Universal Link(通用鏈接)才生效贴妻。

問題匯總

  • 按照上面寫的配好了切油,怎么死活打不開呀?名惩?澎胡?

    1. 支持HTTPS呀,一定要是符合蘋果認(rèn)證的HTTPS證書呀。
    2. 系統(tǒng)問題攻谁,確保iOS9.0以上
    3. 配置文件問題稚伍,apple-app-site-association文件中配置的path和測試用的通用鏈接不一致,注意是區(qū)分大小寫的戚宦。
    4. 域名問題个曙,Xcode中配置的域名一不小心寫錯(cuò)了。
  • 為毛有的手機(jī)成功了受楼,有的手機(jī)就不行呢垦搬??艳汽?

    1. 上面也提到過猴贰,因?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文件糟趾。
    2. 另外一種可能是蘋果抽風(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)提示頁面祥山。

    如果是蘋果用戶圃验,那么分兩種:

    1. 如果是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)流。
    2. 如果是9.0以下的系統(tǒng)麻裁,則相應(yīng)的 “在APP內(nèi)打開”的按鈕就會發(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)過這個(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。

參考鏈接:

  1. 官方文檔
  2. 蘋果驗(yàn)證通用鏈接是否可用的網(wǎng)站
  3. 通用鏈接文件存放的server需要支持HTTPS蘋果支持的HTTPS證書列表

文章若有不對地方蔓同,歡迎批評指正

作者:CodeRookie
鏈接:http://www.reibang.com/p/ab50bdaec65d

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饶辙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斑粱,更是在濱河造成了極大的恐慌弃揽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件则北,死亡現(xiàn)場離奇詭異矿微,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尚揣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門涌矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人快骗,你說我怎么就攤上這事娜庇。” “怎么了方篮?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵名秀,是天一觀的道長。 經(jīng)常有香客問我恭取,道長泰偿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任蜈垮,我火速辦了婚禮,結(jié)果婚禮上裕照,老公的妹妹穿的比我還像新娘攒发。我一直安慰自己,他們只是感情好晋南,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布惠猿。 她就那樣靜靜地躺著,像睡著了一般负间。 火紅的嫁衣襯著肌膚如雪偶妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天政溃,我揣著相機(jī)與錄音趾访,去河邊找鬼。 笑死董虱,一個(gè)胖子當(dāng)著我的面吹牛扼鞋,可吹牛的內(nèi)容都是我干的申鱼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼云头,長吁一口氣:“原來是場噩夢啊……” “哼捐友!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溃槐,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤匣砖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昏滴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猴鲫,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年影涉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了变隔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟹倾,死狀恐怖匣缘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲜棠,我是刑警寧澤肌厨,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站豁陆,受9級特大地震影響柑爸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盒音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一表鳍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祥诽,春花似錦譬圣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至维哈,卻和暖如春绳姨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阔挠。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工飘庄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谒亦。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓竭宰,卻偏偏與公主長得像空郊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子切揭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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