iOS - 好好利用Safari 之 通用鏈接 Universal Link

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

  1. 先決條件:必須有一個支持 HTTPS 的域名惠呼,并且擁有該域名下的上傳到根目錄的權(quán)限(為了上傳 Apple 指定文件 apple-app-site-association )。

  2. 開發(fā)者中心配置:找到對應(yīng)的 App ID 峦耘,在 Application Services 列表里有 Associated Domains 一項(xiàng)剔蹋,把它變?yōu)?Enabled 就可以了。

  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: 為前綴猎莲。

  4. 配置指定文件:創(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 所處理娇钱。星號的寫法代表了可識別域名下所有鏈接。
  1. 上傳指定文件:上傳該文件到你的域名所對應(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)前 webviewURL 域名,與跳轉(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)到我們 APP URL 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 Linkw.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 胰伍。

參考鏈接:

蘋果官方文檔

蘋果驗(yàn)證通用鏈接是否可用的網(wǎng)站

Universal Link 文件存放的 server 需要支持 HTTPS 蘋果支持的 HTTPS 證書列表

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酸休,隨后出現(xiàn)的幾起案子骂租,更是在濱河造成了極大的恐慌,老刑警劉巖斑司,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渗饮,死亡現(xiàn)場離奇詭異,居然都是意外死亡宿刮,警方通過查閱死者的電腦和手機(jī)互站,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糙置,“玉大人云茸,你說我怎么就攤上這事“梗” “怎么了标捺?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揉抵。 經(jīng)常有香客問我亡容,道長,這世上最難降的妖魔是什么冤今? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任闺兢,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屋谭。我一直安慰自己脚囊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布桐磁。 她就那樣靜靜地躺著悔耘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪我擂。 梳的紋絲不亂的頭發(fā)上衬以,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音校摩,去河邊找鬼看峻。 笑死,一個胖子當(dāng)著我的面吹牛衙吩,可吹牛的內(nèi)容都是我干的互妓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼分井,長吁一口氣:“原來是場噩夢啊……” “哼车猬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尺锚,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤珠闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘫辩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伏嗜,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年伐厌,在試婚紗的時候發(fā)現(xiàn)自己被綠了承绸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠豺。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡莱预,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出实蔽,到底是詐尸還是另有隱情卷扮,我是刑警寧澤荡澎,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站晤锹,受9級特大地震影響摩幔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞭铆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一或衡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦封断、人聲如沸斯辰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椒涯。三九已至,卻和暖如春回梧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祖搓。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工狱意, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拯欧。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓详囤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镐作。 傳聞我的和親對象是個殘疾皇子藏姐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359