iOS Universal Links(通用鏈接) 適配小結

簡介

Universal Links 是蘋果在2015年WWDC上推出的一項新功能,官方功能描述如下:

In iOS 9 and later, universal links let users open your app when they tap links to your website within WKWebView and UIWebView views and Safari pages, in addition to links that result in a call to openURL:, such as those that occur in Mail, Messages, and other apps.

簡單來說即當用戶在 WKWebView、UIWebView 或者 Safari 中點擊一個鏈接,如果設備上安裝了適配該鏈接的 app,就可以跳轉該 app 對應的頁面,否則仍然展示網頁 。由于目前微信內置瀏覽器仍然不支持 openURL 的方式進行應用間的跳轉,不少 app 產品通過接入 Universal Links 實現微信瀏覽器一鍵跳轉到自己app的功能。

效果

在“取暖” app 中接入 Universal Links ,微信中打開分享的話題,點擊底部“打開App”按鈕,直接跳轉到“取暖”對應的話題詳情頁面:


微信一鍵跳轉到app

流程

1.創(chuàng)建一個包含 JSON 數據的 apple-app-site-association 文件,內容格式如下:
apple-app-site-association 文件內容

? appID:app Prefix + Bundle ID, 其中 app Prefix 可以從蘋果開發(fā)賬號頁面"Certificates, Identifiers & Profiles" - "Identifiers" - "App IDs" 下找到對應 App IDs 查看,Bundle ID 可以在項目的 target -- General 中找到;

? paths :設定你的 app 支持的路徑列表,只有這些指定的路徑的鏈接,才能被 app 所處理。其中 "*" 表示任意路徑(可接于指定路徑后面,表示該指定路徑下的所有子路徑),"?" 表示替換路徑中的一個字符。

Use * to specify your entire website

Include a specific URL, such as /wwdc/news/, to specify a particular link

Append * to a specific URL, such as /videos/wwdc/2015/*, to specify a section of your website

In addition to using * to match any substring, you can also use ? to match any single character. You can combine both wildcards in a single path, such as /foo/*/bar/201?/mypage.

注意點:
1> 正常情況下app Prefix 和開發(fā)者賬號頁面"Membership" - "Membership information" 中的Team ID是相同的,但是對于一些年代比較久遠的app,這兩個值可能會不同,此時應該選擇app Prefix;

app Prefix

2> paths 大小寫敏感;

3> "?" 表示替換一個字符,但是類似"#"這種特殊字符不可以被替換,例如paths中填寫 "/foo/*/bar/201?/mypage",如果實際域名中路徑為 "/foo/abc/bar/201#/mypage",則無法實現跳轉;

4> apple-app-site-association 文件的內容是JSON格式,其本身并沒有任何后綴名;

2.將 apple-app-site-association 文件上傳到服務器的 ".well-known" 或者根目錄下(親測兩個目錄均能生效)。
3. 在 Xcode - TARGETS - Capabilities 中打開 "Associated Domains" 開關,在Domains中添加需要進行跳轉的域名(所有適配的域名前面都需要加上 "applinks:" 才能生效);
配置域名

完成步驟2和3,可通過蘋果官方提供的網址進行驗證是否生效,如果域名配置成功、apple-app-site-association 文件上傳成功且格式正確,則 "Link to Application" 狀態(tài)為 "PASSED".

配置成功1

實際適配過程中,會出現文件正常上傳,瀏覽器中訪問地址也可以正常下載 apple-app-site-association 文件,但是通過上述網站進行驗證顯示狀態(tài)不通過的情況。這時也可以通過在備忘錄中添加記事本或短信中輸入App能識別的鏈接,如果直接點擊此鏈接能直接跳轉到你的app,或是長按鏈接文字,在出現的彈出菜單中第二項是“在'XXX'中打開”,也代表配置成功。

配置成功2
4. 在項目的 AppDelegate 里實現回調方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
    if ([userActivity.activityType   isEqualToString:NSUserActivityTypeBrowsingWeb]) {

      NSURL *webpageURL = userActivity.webpageURL;
      NSString *host = webpageURL.host;

      if ([host isEqualToString:@"xxxx.com"]) { // "xxxx.com"為步驟3中配置的域名
        // 解析路徑、跳轉到指定界面 and so on...
    }
    else {
      [[UIApplication sharedApplication]openURL:webpageURL];
    }
  }
  return YES;
}```

當 userActivity 類型為 NSUserActivityTypeBrowsingWeb , 表明它是由Universal Links捕獲進來,即可以添加解析路徑、跳轉到指定界面等具體操作。

# 補充
需要特別注意一點:必須跨域才能支持 Universal Links !

>When a user is browsing your website in Safari and they tap a universal link to a URL in the same domain as the current webpage, iOS respects the user’s most likely intent and opens the link in Safari. If the user taps a universal link to a URL in a different domain, iOS opens the link in your app.

舉例假設當前微信瀏覽器中話題詳情頁面的 URL 為 "www.baidu.com/XXX/YYY",底部“打開App”按鈕對應的鏈接URL為 "www.baidu.com/AAA/BBB",雖然通過上述4步配置了 "www.baidu.com/AAA/BBB" 路徑,但由于兩者都在百度的域名下,因此實際不能完成跳轉。

通過以上4步及跨域支持,即可實現一鍵從微信跳轉到app的功能,但是細心的讀者可能會發(fā)現,從微信跳轉到app的時候,屏幕右上角還有個 "warmup.cc" 的小箭頭:

![右上角跳轉箭頭](http://upload-images.jianshu.io/upload_images/716949-5fdb94194ba43dc4.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

點擊該箭頭,會在Safari中打開該頁面。此時再回到微信瀏覽器中點擊 "打開App"按鈕,神奇的事情出現了:無法跳轉到app?。?!

解決方案:在Safari中打開該頁面,將網頁拉倒最頂部,會出現一個懸浮框,點擊懸浮框中的打開按鈕,又跳回到app中打開指定頁面,此時再回到微信瀏覽器中點擊 "打開App"按鈕,又能正常跳轉到app了。

![Safari中的橫條](http://upload-images.jianshu.io/upload_images/716949-112d6b0ee9dca183.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

分析:Universal Links 功能的接入其實相當于給某些 URL 添加了一種新的打開方式,但是舊的通過瀏覽器打開 URL 的方式仍然可用,當點擊右上角跳轉箭頭時,相當于又設置這些特定 URL 的默認打開方式為瀏覽器而非 web,因此一鍵跳轉功能此時會失效。反之通過點擊頂部 "打開" 按鈕,相當于又將這些特定 URL 的默認打開方式修改為 app ,一鍵跳轉功能恢復正常。

ps:在Safari中打開頁面剛進入時,橫條是隱藏的,一定要將頁面拉到最頂部時才能顯示。之前曾考慮通過修改頁面布局讓其默認顯示,但是由于其并不是網頁內部元素,以失敗告終 T^T .
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容