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

iOS 9以前,一直使用的是URL Schemes技術來從外部對App進行跳轉,可是iOS系統中進行URL Schemes跳轉的時候若是沒有安裝App,會提示Cannot open Page的提示,並且當註冊有多個scheme相同的時候,目前沒有辦法區分,可是從iOS 9起可使用Universal Links技術進行跳轉頁面,這是一種體驗更加完美的解決方案git

  • 什麼是Universal Link(通用連接) Universal LinkAppleiOS 9推出的一種可以方便的經過傳統HTTPS連接來啓動APP的功能。若是你的應用支持Universal Link,當用戶點擊一個連接時能夠跳轉到你的網站並得到無縫重定向到對應的APP,且不須要經過Safari瀏覽器。若是你的應用不支持的話,則會在Safari中打開該連接github

  • 支持Universal Link(通用連接) 先決條件:必須有一個支持HTTPS的域名,而且擁有該域名下上傳到根目錄的權限(爲了上傳Apple指定文件)web

  • 集成步驟json

  1. 開發者中心配置 找到對應的App ID,在Application Services列表裏有Associated Domains一條,把它變爲Enabled就能夠了 api

    配置App ID支持Associated Domains

  2. 工程配置 targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名,必須以applinks:爲前綴,如:applinks:domain 跨域

    配置項目中的Associated Domains

  3. 配置指定文件 建立一個內容爲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.BundleID。如上面的9JA89QQLNQ就是teamId。登錄開發者中心,在Account -> Membership裏面能夠找到Team ID paths:設定你的app支持的路徑列表,只有這些指定路徑的連接,才能被app所處理。*的寫法表明了可識別域名下全部連接bash

  1. 上傳該文件 上傳該文件到你的域名所對應的根目錄或者.well-known目錄下,這是爲了蘋果能獲取到你上傳的文件。上傳完後,先訪問一下,看看是否可以獲取到,當你在瀏覽器中輸入這個文件連接後,應該是直接下載apple-app-site-association文件服務器

  2. 代碼中的相關支持 當點擊某個連接,能夠直接進咱們的app,可是咱們的目的是要可以獲取到用戶進來的連接,根據連接來展現給用戶相應的內容,咱們須要在工程裏實現AppDelegate對應的方法:app

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    // NSUserActivityTypeBrowsingWeb 由Universal Links喚醒的APP
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        if ([host isEqualToString:@"api.r2games.com.cn"]){
            //進行咱們的處理
            NSLog(@"TODO....");
        }else{
            NSLog(@"openurl");
            [[UIApplication sharedApplication] openURL:webpageURL options:nil completionHandler:nil];
            // [[UIApplication sharedApplication] openURL:webpageURL];
        }
    }
    return YES;
}
複製代碼

蘋果爲了方便開發者,提供了一個網頁驗證咱們編寫的這個apple-app-site-association是否合法有效

  • Universal Link(通用連接)注意點
  1. Universal Link跨域 Universal Link有跨域問題,Universal Link必需要求跨域,若是不跨域,就不會跳轉(iOS 9.2以後的改動) 假如當前網頁的域名是A,當前網頁發起跳轉的域名是B,必需要求BA是不一樣域名纔會觸發Universal Link,若是BA是相同域名,只會繼續在當前WebView裏面進行跳轉,哪怕你的Universal Link一切正常,根本不會打開App
  2. Universal Link請求apple-app-site-association時機
  • 當咱們的App在設備上第一次運行時,若是支持Associated Domains功能,那麼iOS會自動去GET定義的Domain下的apple-app-site-association文件

  • iOS會先請求https://domain.com/.well-known/apple-app-site-association,若是此文件請求不到,再去請求https://domain.com/apple-app-site-association,因此若是想要避免服務器接收過多GET請求,能夠直接把apple-app-site-association放在./well-known目錄下

  • 服務器上apple-app-site-association的更新不會讓iOS本地的apple-app-site-association同步更新,即iOS只會在App第一次啓動時請求一次,之後除非App更新或從新安裝,不然不會在每次打開時請求apple-app-site-association

  • Universal Link的好處

  1. 以前的Custom URL scheme是自定義的協議,所以在沒有安裝該app的狀況下是沒法直接打開的。而Universal Links自己就是一個可以指向web頁面或者app內容頁的標準web link,所以可以很好的兼容其餘狀況
  2. Universal links是從服務器上查詢是哪一個app須要被打開,所以不存在Custom URL scheme那樣名字被搶佔、衝突的狀況
  3. Universal links支持從其餘app中的UIWebView中跳轉到目標app
  4. 提供Universal link給別的app進行app間的交流時,對方並不可以用這個方法去檢測你的app是否被安裝(以前的custom scheme URLcanOpenURL方法能夠)

附:個人博客地址

相關文章
相關標籤/搜索