打通 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

相关文章
相关标签/搜索