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

  • 包含Xcode11.0的配置方式和iOS13出現的問題。

什么是Universal Link(通用鏈接)

Universal Link(通用鏈接)是Apple在iOS9推出的一種能夠方便的通過傳統HTTPS鏈接來啟動APP的功能,可以使用相同的網址打開網址和APP。當你的應用支持Universal Link(通用鏈接),當用戶點擊一個鏈接是可以跳轉到你的網站并獲得無縫重定向到對應的APP,且不需要通過Safari瀏覽器。如果你的應用不支持的話,則會在Safari中打開該鏈接。在蘋果開發者中可以看到對它的介紹是:

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鏈接,當然是我們在該鏈接域名根目錄配置過的一個鏈接,也可以在該鏈接中放置對應的H5頁面。當用戶的點擊該鏈接,只要手機中安裝了支持該鏈接的APP就會直接進入到APP中。如果沒有安裝APP則會跳轉到Safari瀏覽器中,展示H5頁面。對用戶來說則是一個無縫跳轉的過程。

Universal Link(通用鏈接)的應用場景

使用Universal Link(通用鏈接)可以讓用戶在Safari瀏覽器或者其他APP的webview中拉起相應的APP,也可以在APP中使用相應的功能,從而來把用戶引流到APP中。比如淘寶當在Safari瀏覽器中進入淘寶網頁點擊打開APP則會使用Universal Link(通用鏈接)來拉起淘寶APP。

使用Universal Link(通用鏈接)跳轉的好處

  • 唯一性: 不像自定義的URL Scheme,因為它使用標準的HTTPS協議鏈接到你的web站點,所以一般不會被其它的APP所聲明。另外,URL scheme因為是自定義的協議,所以在沒有安裝 app 的情況下是無法直接打開的(在Safari中還會出現一個不可打開的彈窗),而Universal Link(通用鏈接)本身是一個HTTPS鏈接,所以有更好的兼容性;
  • 安全:當用戶的手機上安裝了你的APP,那么系統會去你配置的網站上去下載你上傳上去的說明文件(這個說明文件聲明了當前該HTTPS鏈接可以打開那些APP)。因為只有你自己才能上傳文件到你網站的根目錄,所以你的網站和你的APP之間的關聯是安全的;
  • 可變:當用戶手機上沒有安裝你的APP的時候,Universal Link(通用鏈接)也能夠工作。如果你愿意,在沒有安裝你的app的時候,用戶點擊鏈接,會在safari中展示你網站的內容;
  • 簡單:一個HTTPS的鏈接,可以同時作用于網站和APP;
  • 私有: 其它APP可以在不需要知道你的APP是否安裝了的情況下和你的APP相互通信。

支持Universal Link(通用鏈接)

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

  2. 開發者中心配置:找到對應的App ID,在Application Services列表里有Associated Domains一條,把它變為Enabled就可以了。

    配置App ID支持Associated Domains:

  3. 工程配置:

  • Xcode 11.0版本
    工程配置中相應功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名,也必須必須以applinks:為前綴。
    具體步驟如下圖:

  • Xcode 11.0以下版本
    工程配置中相應功能:targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名,必須以applinks:為前綴。
    配置項目中的Associated Domains:

  1. 配置指定文件:創建一個內容為json格式的文件,蘋果將會在合適的時候,從我們在項目中填入的域名請求這個文件。這個文件名必須為apple-app-site-association,切記沒有后綴名,文件內容大概是這樣子:

    {
        "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。登陸開發者中心,在Account -> Membership里面可以找到Team ID。

    paths:設定你的app支持的路徑列表,只有這些指定的路徑的鏈接,才能被app所處理。星號的寫法代表了可識 別域名下所有鏈接。

  2. 上傳指定文件:上傳該文件到你的域名所對應的根目錄或者.well-known目錄下,這是為了蘋果能獲取到你上傳的文件。上傳完后,自己先訪問一下,看看是否能夠獲取到,當你在瀏覽器中輸入這個文件鏈接后,應該是直接下載apple-app-site-association文件。

Universal Link(通用鏈接)相關驗證

在iOS設備中的備忘錄中輸入APP能識別的鏈接,然后直接點擊此鏈接,就會直接跳轉到你的app了。或是長按,在出現的彈出菜單中第二項是在’XXX’中打開,這也代表著成功:

或是你將要測試的網址在Safari中打開,在出現的網頁上方下滑,可以看到有在”XX”應用中打開:

出現菜單:

當點擊某個鏈接,直接可以進我們的app了,但是我們的目的是要能夠獲取到用戶進來的鏈接,根據鏈接來展示給用戶相應的內容。
我們需要在工程里的實現AppDelegate里對應的方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
    {
        NSURL *url = userActivity.webpageURL;
        if (url是我們希望處理的)
        {
            //進行我們的處理
        }
        else
        {
            [[UIApplication sharedApplication] openURL:url];
        }
    }

    return YES;
}

蘋果為了方便開發者,提供了一個網頁來驗證我們編寫的這個apple-app-site-association是否合法有效,進入驗證網址進行驗證:

注意
前端開發經常面臨跨域問題,必須要求跨域,如果不跨域,就不行。
只有當前webviewURL域名,與跳轉目標URL域名不一致時,Universal Link(通用鏈接)才生效。

問題匯總

  • 按照上面寫的配好了,怎么死活打不開呀???

    1. 支持HTTPS呀,一定要是符合蘋果認證的HTTPS證書呀。
    2. 系統問題,確保iOS9.0以上
    3. 配置文件問題,apple-app-site-association文件中配置的path和測試用的通用鏈接不一致,注意是區分大小寫的。
    4. 域名問題,Xcode中配置的域名一不小心寫錯了。
  • 為毛有的手機成功了,有的手機就不行呢???

    1. 上面也提到過,因為網絡波動有可能會導致部分用戶第一次安裝時,無法下載apple-app-site-association文件,這個只能引導用戶刪除重裝或者在迭代時修改Associated Domains配置告訴系統重新下載apple-app-site-association文件。
    2. 另外一種可能是蘋果抽風導致,筆者今年年初一碰到過一個蛋疼的問題,從中午一直到下午4點發現重復的刪除重裝,app也不會請求服務器的apple-app-site-association文件,過了4點之后就好了。當時因為時間特殊并沒有深究到底是什么原因導致。
  • 服務器換域名了腫么辦???
    當Associated Domains添加新的 Domains的之后,在app再次啟動的時候抓包發現(不需要刪除重裝),蘋果會給新添加的這個Domains發送一個請求,請求新Domain下的apple-app-site-association文件。

    也就是說Associated Domains發生改變的話,系統是會知道的,這樣就可以在迭代的時候刪除舊的域名,添加新的域名了。
    另外Domains的配置也可以使用通配符,例如:applinks:*.mywebsite.com

  • 全都配置好了,項目也能喚起來了,web頁面到底該怎么弄呀???通用鏈接指向的服務器的頁面到底應該是哪個?

    之前iOS和安卓用的是同一個網頁,也就是說從APP內分享出去的網頁,可以被蘋果用戶和安卓用戶同時查看,在這里需要由web童鞋使用js判斷當前所處的平臺以及其系統。

    如果是安卓用戶,則顯示安卓相關提示頁面。

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

    1. 如果是9.0以上的系統,相關的“在APP內打開”按鈕的鏈接配置的就是我們的Universal Link(通用鏈接)了,且該通用鏈接地址指向的是一個APP下載引導頁面,那么當用戶安裝了APP,即可通過通用鏈接喚醒APP;如果用戶沒有安裝app,那么就會跳轉到通用鏈接指向的APP下載引導頁面,達到最大化的客戶導流。
    2. 如果是9.0以下的系統,則相應的 “在APP內打開”的按鈕就會發一個跳轉到我們APP URL Scheme的重定向,以實現在Safari中喚醒我們的APP。
  • 當使用通用鏈接喚醒APP之后,手機右上角有一個小按鈕?
    那個小按鈕只有(在iOS10.0以下才有)是可以引導用戶跳轉到Safari中,名字叫bread crumbs button(面包屑),當然也去不掉;并且當用戶點過這個按鈕后,再點擊Universal Link(通用鏈接)不會直接打開對應的APP。

  • 備忘錄和safari中都可以打開app,怎么分享到其他app里面就不行了?

    未跨域導致的,如:分享到微信的鏈接是https://www.mydomain.com/share.html,然后該網頁中的“在app內打開”按鈕配置的通用鏈接為https://www.mydomain.com/index.html
    跨域的意思是說,通用鏈接 和 調用通用鏈接的網頁不要使用同一域名。
    即如果通用鏈接域名為www.mydomain.com,則通用鏈接所處的網頁域名就不能是www.mydomain.com

  • 微信已經禁用了Universal Link(通用鏈接)

  • iOS13中在safari中可以打開相應APP,但是從微信或其他APP中點擊去safari怎么就打開了別的APP?
    在iOS13之前在其他APP去safari中打開Universal Link(通用鏈接)系統匹配域名是全匹配,而在iOS13之后規則發生了變化,猜測是包含關系。比如在iOS13之前,如果Universal Link(通用鏈接)為w.mydomain.com那么在微信或者其他APP訪問www.mydomain.com然后點擊去safari打開則不會拉起相應APP,而在iOS13則會拉起相應APP。
    而在safari中輸入的鏈接則依然和iOS之前一樣,只有www.mydomain.com才會提示打開相應APP。

參考鏈接:

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容