在WWDC 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App]。虽然它不是一个必须实现的功能, 但还是需要引起一些注意。

在网上有太多让人迷惑和错误的信息, 这次 WWDC 本身也没有去描述细节。幸运的是, 在 HOKO 我们在我们的智能链接上添加了这一特性, 所以我们可以无缝的引导用户到 APP 上。

什么是通用链接?

很显然 Apple 正在大力推动 APP 开发者在深层链接上有更好的体验。所有的消息都围绕着深层链接技术。与此同时, Apple 推出通用链接:一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开网站和 APP。

通 过唯一的网址, 就可以链接一个特定的视图到你的 APP 里面, 不需要特别的 schema 。试想一下 Twitter 使用了通用链接, 那么你每在 twitter。com 点击一个链接, 你的 iOS 设备都会在 Twitter 里面自动打开这个页面, 而不是当你没有安装时转到普通的网页。这个用户体验是顺畅的, 最重要的是用户不会失去上下文(跳到 APP 后 Safari 上不再留下空标签)。

准备使用通用链接

实现通用链接不难, 但首先必须遵守一些先决条件。如下:

  • 有一个注册的域名

  • 通过 SSL 访问域名

  • 支持上传一个 JSON 文件到你的域名

  • 至少 iOS 9 beta 2 版本 [下载],这很重要, 因为如果是之前的测试版本你需要做额外的操作。

  • 至少 Xcode 7 beta 2 [下载]

如果你都有了, 那就来按照下面3个步骤来做吧。

1.添加域名到 Capabilities

首先, 你必须在 Xcode 的 capabilities 里 添加你的 APP 域名, 必须用 applinks: 前置它:还添加一些你可能拥有的子域和扩展(www.domain.com, news.domain.com 等等)。

用 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。你可以从你的 [苹果开发账号页面]获取你的团队标识:

这个页面有你的团队标识, 你可以拷贝粘贴到 apple-app-site-association 文件

Bundle id 可以在项目的 target -- General 中找到:

检查 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 以显示错误。

总结如图:

上图是通用链接的工作流程的概要

通用链接的缺点

通用链接对于开发人员来说是一个好主意, 但也有一些缺点可能会导致不受青睐。

通用链接只适用于 iOS 9 +

配置 APP 支持通用链接意味着只有运行 iOS 9 的用户才能享用这一技术优势。 而之前版本的用户将不能在点击网页链接时打开 APP。 相反的, 他们将返回到浏览器和网页, 就像之前正常的网页链接一样。

然后, HOKO为 iOS 5 及更高版本的用户提供了移动深层链接。 因此, 你的移动深层链接将可以运行在几乎所有的 iOS 设备上, 不管它们是不是 iOS 9。

通用链接总是会返回到先前创建的网页

如果你想退回主页或与 APP 完全不不相关的网站?实现这一目标需要一些额外的工作, 要配置一个网页可以指引用户到你的目标页面。 此外, 如果你没有一个网站的话, 这将会是一个不可能的解决方案。

你可以使用 HOKO 智能链接和他们自适应的返回来轻松的解决这个问题。 对于创建的每个智能链接, 你可以在每个平台上选择如果没有安装 APP 会发生什么。 另外你可以设置返回到你的网站, iTunes 商店页面或其它外部网站。

使用通用链接, 开发者必须部署一个网站来关联 APP

这对于小型开发者来说可能是个坏消息, 他们可能买不起或维护一个网站, 但是仍然想通过网页链接进入他们的 APP。

HOKO 可以解决这个问题因为它来充当开发者的网站, 每个 APP 托管在不同的子域。 因此, 开发者只需创建智能链接, 并发布其网址, 然后每次都会无缝的打开相应的 APP。

APP 与网站之间的联系是由创建和托管在开发者网站上的配置文件搞定的

使用 HOKO, 你可以跳过这些繁的配置, 因为我们使它可以开箱即用。 此外, 我们的服务器运行在有行业顶级标准的安全性和性能上, 为每个设备提供安全和快速的方式。

iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)的更多相关文章

  1. iOS/iPhone学习系列、代码教程

    part 1--入门: 1. xcode 版本下载 以及 iphone sdk 下载: 最新版本在此下载: http://developer.apple.com/devcenter/ios/index ...

  2. iOS 9 学习系列: Xcode Code Coverage

    Code coverage 是一个计算你的单元測试覆盖率的工具. 高水平的覆盖给你的单元測试带来信心.也表明你的应用被彻底的測试过了. 你可能写了几千个单元測试,但假设覆盖率不高.那么你写的这套測试可 ...

  3. iOS 9 学习系列:Split Screen Multitasking

    http://www.cocoachina.com/ios/20151010/13601.html iOS 9 的一个重大变化就是增加了多任务,这个多任务允许用户在屏幕上同时运行多个 app.有两种形 ...

  4. iOS 9 学习系列:UIStack View

    http://www.cocoachina.com/ios/20150921/13492.html 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方式,纵向或 ...

  5. iOS 9 学习系列:Storyboard References

    http://www.cocoachina.com/ios/20150922/13474.html 如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后 ...

  6. iOS 9 学习系列:UIStack View (转载)

    作者:Nathan_Bao 地址:http://www.jianshu.com/p/1991e6c2881a 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方 ...

  7. (ios开发学习笔记一)ios项目文件结构

    转自:http://www.cnblogs.com/macroxu-1982/archive/2012/07/31/2616389.html 下面是单个窗体项目例子,我们从这个项目开始,说明ios项目 ...

  8. iOS 9 通用链接(Universal Links)

    什么是Universal Links? 在iOS9之前,对于从各种从浏览器.Safari中唤醒APP的需求,我们通常只能使用scheme.但是这种方式需要提前判断系统中是否安装了能够响应此scheme ...

  9. iOS Universal Links(通用链接)

    公司的运维,发现最近大量的请求 /.well-known/apple-app-site-association这个文件,造成了大量的404,可是这是谁请求的呢? 其实是苹果从iOS9.3开始更改了通用 ...

随机推荐

  1. 贝赛尔曲线UIBezierPath

    使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线 ...

  2. dede织梦批量导入关键词

    在后台替换对应的文件件即可. 注意:如果你的关键字长度超过16个字符的话,需要更改 dede 中 keywords 表中的keyword 字段字符长度 article_keywords_main.ph ...

  3. linux phpexcel导出后打不开

    在PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 后面加一行 ob_clean();

  4. Web爬虫入门

    1.0示例学习:Web爬虫 public class WebCrawler { // 种子url private static String url = "http://www.cnblog ...

  5. Express4+Mongodb超简单入门实例

    开始前,请确保mongodb已经能正常工作,安装教程:windows下MongoDB的安装及配置 , 请自行安装配置.下面进入正文: 第一步:命令行创建数据库.表,并插入一条数据 命令如下: //创建 ...

  6. Python Day12

    MySQL 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们 ...

  7. 15 个实用的 PHP 正则表达式

    1:验证域名检验一个字符串是否是个有效域名 2:从一个字符串中 突出某个单词 3:从HTML文档中获得全部图片 如果你曾经希望去获得某个网页上的全部图片,这段代码就是你需要的,你可以轻松的建立一个图片 ...

  8. textView的提醒文字

    如果我们想提交一些备注信息,会想到用textFiled和textView两种控件去实现 1.提醒文字是textFiled的特有属性,但是textFiled显示文本只有一行,不能实现我们输入较多文字的情 ...

  9. getElementsByClassName简单实现

    function getElementsByClassName(node, className) { var aClassReg = className.split(' ').map(function ...

  10. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...