创建通用链接

原文:Universal Links – Make the Connection
作者:Owen Brown
译者:kmyhy

你有要和 iOS app 共享内容的网站吗?在 iOS 9 中,你可以用通用链接将它们联系起来,这意味着用户可以点击一个 HTTP 链接,然后直接跳转到你的 app!

在本教程中,你将学习如何连接一个 iOS app 到 Heroku 网站。app 和网站都展示了一些关于单板机的内容,这下硬件发烧友们有福了!我猜你一定也会对单板机感兴趣的 :]

本教程假设你有一定的 Swift 和 iOS 开发基础。如果你没有,请先阅读其他 Swift 和 iOS 开发教程。最好拥有一些 Heroku 和 web 开发经验,但没有也没有关系。

最后,你必须有一个付费的苹果开发者账号。很不幸,免费账号是不能工作的。

注:通用链接是 URL Schemes 的替换方案之一。它们会将一个小文件放在 web 域的根目录下(HTTPS 服务),在文件中指出某个 app 的 AppID,而这个 AppID 必须向苹果注册能够处理该域名下的链接。

由于这些限制,如果你没有一个真正的可访问的 HTTPS 网站和一个真正的发布在 App Store 的 app,你就无法真正测试通用链接。当然你仍然可以通过阅读下面的通用链接创建过程来进行体验。

开始

下载开始项目。编译运行 App,你能看到程序的主界面——ComputersController。

这个 app 列出了当前市面上最流行的几个单板机产品。点击任意一个,将呈现详情页面,即 ComputerDetailController。在这个页面显示了产品规格,例如网址、供应商、价格等等。

我们也创建了一个显示同样内容的网站。请看这里。

不要担心 Heroku 的内容:本教程只是用它来快速建立一个你能够浏览的网站而已。当然,你也可以将网站部署到自己的 Heroku 账号下。如果你准备这样做,请参考这里。

看完 app 和网站之后,我们来看看如何将它们联系到一起。我们的目的是:当用户在网页上点击类似这样 https://rw-universal-links-starter.herokuapp.com/arduino.html 的链接时,我们的 app (而不是 Safari)会自动打开。在本文的最后,这个 app 甚至能够跳转并呈现某个单板机的详情。

要完成这个目的,你需要做三件事情:

  • 告诉网站要和哪个 app 关联。
  • 告诉 app 要和哪个网站关联。
  • 当点击链接时,在 app 中进行处理并导航。

创建通用链接需要满足几件事情。首先,你必须对网站有“写入权限”,它必须是 HTTPS 的,你要能够将文件上传给它。其次,你必须创建一个关联的 ap,这样你就可以编辑它的 provisioning profile 文件,在 capabilities 中注册这个网站,然后将它发布到 App Store。
因此,你无法用本教程中的 app 进行测试。但是你可以通过本文的阅读了解整个过程的发生。

App 的配置

首先需要对 app 进行设置,才能对处理通用链接。打开开始项目的 UniversalLinks.xcodeproj,依次进行操作:
1. 选择 UniversalLinks 项目。
2. 选择 target - UniversalLinks。
3. 点击 Capabilities 标签。
4. 找到并打开 Associated Domains 选项。

你可能会看到提示,要你选择开发团队,以便应用 Provisioning Profile。这时请选择一个付费的开发团队,然后按 Choose 按钮。
如果你看到的提示是 Add an Apple ID Account,这表明你还没有登录开发者账号。这时,请按 Add 按钮,登录你所加入的某个付费的开发团队。

注意,必须是付费账号。我在试图用免费账号时,Xcode 总是会崩溃,显然这是某个 Bug。

你可能会看到错误提示 “An App ID with identifier ‘com.razeware.UniversalLinks’ is not available”。这是因为这个 App ID 被本教程中的 app 占用了。

如果是你自己的 app,请确认你的 app ID 是唯一的(遵循反域名规则)。对于本教程中的 app,简单地忽视这个提示即可。;]

然后,按 + 按钮添加一个域名如下:

applinks:rw-universal-links-final.herokuapp.com

确认输入了 applinks:前缀。你会看到如下画面:

第一步到这里就完成了!这个 app 已经和网站的 URL 进行了关联。接下来,你应该对网站进行配置。

网站的配置

现在你需要让网站知道这个”好消息“。这需要创建一个 apple-app-site-association 文件。这个文件对于 iOS 开发者来说并不陌生:在 iOS 8 的 web 凭证和 Handoff 中,也使用了这个文件。文件是一个 JSON 文件,不过不以 .json 作为后缀名。它没有后缀名,为了满足你的 debug 情节,请双击文件名进行检查。

创建一个 apple-app-site-association 文件,内容如下:

{
  "applinks": {
    "apps": [],
    "details": [
    {
      "appID": "KFCNEC27GU.com.razeware.UniveralLinksTutorial",
      "paths": ["*"]
    }
    ]
  }
}

applinks 标签用于指定这个网站和哪些 app 进行关联。apps 字段先保留一个空数组。在 details 字段,加入一个 dictionary 数组,每个 dictionary 中包含一个 appID 键和一个 paths 键。很显然,通配符 * 表示该网站所有的链接都和这个 UniversalLinks app 进行关联。此外,paths 中的内容也可以具体指向某个目录或文件名。

appID 需要包含 team ID 和 bundle ID。这里的 team ID 是属于 Ray Wenderlich 开发团队的 team ID,你应当用自己的 team ID 来替代。

当你注册苹果开发者账号时,苹果会分配给你一个 team ID。你可以在苹果开发者中心看到这个 team ID。登录开发者中心,点击你的账号,在 Developer Account Summary 一节,你可以找到你的 team ID。

你可以在 Xcode 的 Targets\UniversalLinks\General 栏看到 bundle ID:

现在,apple-app-site-association 文件已经准备好了,接下来要将它上传到服务器。

再说一次,你必须拥有网站的写入权限。对于本教程,你可以直接使用到已经搭建好的网站,这个文件已经上传好了。

如果你想确认这个文件是否存在,请浏览 http://rw-universal-links-final.herokuapp.com/apple-app-site-association。你将看到和上面同样的文件内容。

好了!app 知道了网站,网站也知道了 UniversalLinkes app。接下来是最后的步骤:当通用链接被点击时,进行适当的处理。

通用链接的处理

现在,app 和网站正式建立了联系,剩下的就是通用链接的处理了。

打开 AppDelegate.swift,添加如下助手方法:

func presentDetailViewController(computer: Computer) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let detailVC = storyboard.instantiateViewControllerWithIdentifier("NavigationController")
      as! ComputerDetailController
    detailVC.item = computer

    let navigationVC = storyboard.instantiateViewControllerWithIdentifier("DetailController")
      as! UINavigationController
    navigationVC.modalPresentationStyle = .FormSheet

    navigationVC.pushViewController(detailVC, animated: true)
  }

这个方法会打开 ComputerDetailController 并显示某种单板机的详情。这使得我们要跳转到某种单板机的介绍页面时更加容易。接下来你会用到这个方法。

继续在上述方法后添加如下协议方法:

func application(application: UIApplication,
                 continueUserActivity userActivity: NSUserActivity,
                                      restorationHandler: ([AnyObject]?) -> Void) -> Bool {

  // 1
  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
    let url = userActivity.webpageURL,
    let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: true),
    let path = components.path else {
      return false
  }

  // 2
  if let computer = ItemHandler.sharedInstance.items.filter({ $0.path == path}).first {
    self.presentDetailViewController(computer)
    return true
  }

  // 3
  let webpageUrl = NSURL(string: "http://rw-universal-links-final.herokuapp.com")!
  application.openURL(webpageUrl)

  return false
}

这个方法会在通用链接被点击时触发。这个方法完成以下动作:

  1. 首先,检查 userActivity 是否是预期的类型。然后,你需要获得 userActivity 的路径。如果获取失败,返回 false 表明这是 app 无法处理的 activity。
  2. 获得路径后,检查是否有和这个路径相匹配的单板机存在。如果有,展现 ComputerDetailController 并返回 true。
  3. 如果找不到匹配这个路径的单板机,则通知 application 打开这个 URL,这将调用系统默认的 app 来打开 URL,大部分情况下这个 app 是 Safari。同时返回 false,表明这个 app 无法处理 userActivity。

测试链接

前面说过,目前没有什么办法通过示例 app 来测试通用链接。但是当你在自己的 app 中实现通用链接时,你应该知道怎样才是正确的结果。

当你在自己的 app 中实现时,你可以将链接 (比如 https://rw-universal-links-final.herokuapp.com/arduino.html)发送到自己的邮箱里,然后点击它,检查指定的页面是否显示。

注意,通用链接可以从任何地方触发,比如 UIWebView,WKWebView,SFSafariViewController,Notes 或者 Safari。

结尾

这里是最终完成的示例项目,最终完成的网站则在这里。

恭喜!你已经学习了如何在 iOS 中实现通用链接。你可以将它运用到自己的 app 中并创建自己的通用链接了!

如果想继续深入这个主题,请阅读iOS 9 by Tutorials中第3章的内容。
你还可以阅读苹果文档的有关内容。
要测试你网站上的通用链接,可以使用这个工具或者苹果的 link validator,它们可以指出你在配置过程中可能出现的问题。
有任何问题或建议,请在下面留言!

你可能感兴趣的:(iPhone开发)