打通 iOS 9 的通用連接(Universal Links)

在WWDC 2015 上, Apple 爲 iOS 9 宣佈了一個所謂 通用連接 的深層連接特性, 視頻地址爲 [無縫連接到您的 App]。雖然它不是一個必須實現的功能, 但仍是須要引發一些注意。html

在網上有太多讓人迷惑和錯誤的信息, 此次 WWDC 自己也沒有去描述細節。幸運的是, 在 HOKO 咱們在咱們的智能連接上添加了這一特性, 因此咱們能夠無縫的引導用戶到 APP 上。ios

什麼是通用連接?web

很顯然 Apple 正在大力推進 APP 開發者在深層連接上有更好的體驗。全部的消息都圍繞着深層連接技術。與此同時, Apple 推出通用連接:一種可以方便的經過傳統 HTTP 連接來啓動 APP, 使用相同的網址打開網站和 APP。xcode

經過惟一的網址, 就能夠連接一個特定的視圖到你的 APP 裏面, 不須要特別的 schema 。試想一下 Twitter 使用了通用連接, 那麼你每在 twitter。com 點擊一個連接, 你的 iOS 設備都會在 Twitter 裏面自動打開這個頁面, 而不是當你沒有安裝時轉到普通的網頁。這個用戶體驗是順暢的, 最重要的是用戶不會失去上下文(跳到 APP 後 Safari 上再也不留下空標籤)。瀏覽器

準備使用通用連接安全

實現通用連接不難, 但首先必須遵照一些先決條件。以下:服務器

  • 有一個註冊的域名併發

  • 經過 SSL 訪問域名app

  • 支持上傳一個 JSON 文件到你的域名dom

  • 至少 iOS 9 beta 2 版本 [下載],這很重要, 由於若是是以前的測試版本你須要作額外的操做。

  • 至少 Xcode 7 beta 2 [下載]

若是你都有了, 那就來按照下面3個步驟來作吧。

1.添加域名到 Capabilities

首先, 你必須在 Xcode 的 capabilities 裏 添加你的 APP 域名, 必須用 applinks: 前置它:還添加一些你可能擁有的子域和擴展(www.domain.com, news.domain.com 等等)。

apple_capabilities.png

用 applinks: 前綴添加全部域名, 同時不要忘了包含全部可能須要的子域名*

這將使你的 APP 從你的域名請求一個特殊的 JSON 文件 apple-app-site-association。當你第一次啓動 APP,它會從 https://domain.com/apple-app-site-association 下載這個文件。跳到下個步驟來了解如何構建這個文件。

2.上傳 apple-app-site-association 文件

該文件必須存在且爲了安全緣由可以使用 SSL 經過 GET 請求訪問到。你能夠打開一個文本編輯器而後寫一個這樣的簡單 JSON 格式:

1
2
3
4
5
6
7
8
9
10
{
   "applinks" : {
     "apps" : [],
     "details" : {
       "TBEJCS6FFP.com.domain.App" : {
         "paths" :[  "*"  ]
       }
     }
   }
}

根據 paths 鍵設定一個容許的路徑列表(你但願APP 做出反應的路徑), 或只是一個星號若是你想打開 APP 而無論路徑是什麼。

你可能想知道 TBEJCS6FFP.com.domain.App 從何而來, 基本上, 它是加入了你的團隊標識的 bundle id。你能夠從你的 [蘋果開發帳號頁面]獲取你的團隊標識:

45.png

這個頁面有你的團隊標識, 你能夠拷貝粘貼到 apple-app-site-association 文件

Bundle id 能夠在項目的 target -- General 中找到:

1.png

檢查 General 標籤並拷貝粘貼 bundle id 到 apple-app-site-association 文件

最後, 上傳這個文件到你的域名根目錄。若是你打開 https://domain.com/apple-app-site-association 能夠看到你的文件, 那麼你就能夠繼續下一步了。

3.在 APP 裏處理通用連接

爲了在 APP 裏支持通用連接, 你須要在 AppDelegate 裏實現 [application(_:continueUserActivity:restorationHandler:)]。 儘管這種方法能夠用於許多不一樣的目的(好比 [Handoff]和 [搜索 API]), 咱們將只關注如何處理接收到的通用連接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import UIKit
 
extension AppDelegate {
     func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
         if  userActivity.activityType == NSUserActivityTypeBrowsingWeb {
             let webpageURL = userActivity.webpageURL!  // Always exists
             if  !handleUniversalLink(URL: webpageURL) {
                 UIApplication.sharedApplication().openURL(webpageURL)
             }
         }
         return  true
     }
     
     private func handleUniversalLink(URL url: NSURL) -> Bool {
         if  let components = NSURLComponents(URL: url, resolvingAgainstBaseURL:  true ), let host = components.host, let pathComponents = components.path?.pathComponents {
             switch  host {
             case  "domain.com" :
                 if  pathComponents.count >= 4 {
                     switch  (pathComponents[0], pathComponents[1], pathComponents[2], pathComponents[3]) {
                     case  ( "/" "path" "to" , let something):
                         if  validateSomething(something) {
                             presentSomethingViewController(something)
                             return  true
                         }
                     default :
                         return  false
                     }
                 }
             default :
                 return  false
             }
             
         }
         return  false
     }
}

若是提供的 userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 那麼意味着它已經由通用連接 API 代理。這樣的話, 它保證用戶打開的 URL 將有一個非空的 webpageURL 屬性。依據前面的例子, 這將是 http://domain.com/path/to/thezoo 的體現。

爲了確保你的 APP 能夠翻譯 URL 成實際的內容, 你須要作下面幾步:

  • 使用 [NSURLComponents]簡單解析 webpageURL 到 host(如domain。com), 路徑組成同理(如 ["/"]、"path"、"to"以及"thezoo")。

  • 確保能識別 host。

  • 嘗試將 pathComponents 匹配到 APP 的已知內容裏。

  • 驗證該內容實際上能夠被呈現。

  • 呈現內容給用戶。

若是上述步驟有任何一個失敗, Apple 建議你的 APP 應該在 Safari 上打開 webpageURL 以顯示錯誤。

總結如圖:

15.png

上圖是通用連接的工做流程的概要

通用連接的缺點

通用連接對於開發人員來講是一個好主意, 但也有一些缺點可能會致使不受青睞。

通用連接只適用於 iOS 9 +

配置 APP 支持通用連接意味着只有運行 iOS 9 的用戶才能享用這一技術優點。 而以前版本的用戶將不能在點擊網頁連接時打開 APP。 相反的, 他們將返回到瀏覽器和網頁, 就像以前正常的網頁連接同樣。

而後, HOKO爲 iOS 5 及更高版本的用戶提供了移動深層連接。 所以, 你的移動深層連接將能夠運行在幾乎全部的 iOS 設備上, 無論它們是否是 iOS 9。

通用連接老是會返回到先前建立的網頁

若是你想退回主頁或與 APP 徹底不不相關的網站?實現這一目標須要一些額外的工做, 要配置一個網頁能夠指引用戶到你的目標頁面。 此外, 若是你沒有一個網站的話, 這將會是一個不可能的解決方案。

你可使用 HOKO 智能連接和他們自適應的返回來輕鬆的解決這個問題。 對於建立的每一個智能連接, 你能夠在每一個平臺上選擇若是沒有安裝 APP 會發生什麼。 另外你能夠設置返回到你的網站, iTunes 商店頁面或其它外部網站。

使用通用連接, 開發者必須部署一個網站來關聯 APP

這對於小型開發者來講多是個壞消息, 他們可能買不起或維護一個網站, 可是仍然想經過網頁連接進入他們的 APP。 

HOKO 能夠解決這個問題由於它來充當開發者的網站, 每一個 APP 託管在不一樣的子域。 所以, 開發者只需建立智能連接, 併發布其網址, 而後每次都會無縫的打開相應的 APP。

APP 與網站之間的聯繫是由建立和託管在開發者網站上的配置文件搞定的

使用 HOKO, 你能夠跳過這些繁的配置, 由於咱們使它能夠開箱即用。 此外, 咱們的服務器運行在有行業頂級標準的安全性和性能上, 爲每一個設備提供安全和快速的方式。

原博客地址:http://www.cocoachina.com/ios/20150902/13321.html

相關文章
相關標籤/搜索