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

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

    什麼是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.web

如何理解Universal Link(通用連接)

Universal Link(通用連接):看起來就是一條普通的https連接,固然是咱們在該連接域名根目錄配置過的一個連接,也能夠在該連接中放置對應的H5頁面。當用戶的點擊該連接,只要手機中安裝了支持該連接的APP就會直接進入到APP中。若是沒有安裝APP則會跳轉到Safari瀏覽器中,展現H5頁面。對用戶來講則是一個無縫跳轉的過程。json

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:
  4. 配置指定文件:建立一個內容爲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所處理。星號的寫法表明了可識 別域名下全部連接。

  5. 上傳指定文件:上傳該文件到你的域名所對應的根目錄或者.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證書列表

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

相關文章
相關標籤/搜索