iOS9 UniversalLink 实现用链接打开APP

前言

UniversalLink(通用链接),是 Apple 在 WWDC 2015 上为 iOS9 引入的一个新功能,是通过传统 HTTP 链接来启动 App 的技术。可以使用相同的网址打开网站和 App。

通过唯一的网址,如果用户有安装域名绑定的 App,点击就可以打开 App,跳转到具体的界面,不需要特殊的 Schema;如果用户没有安装 App 则点击链接跳到对应的普通网页。

依赖

  • Xcode 7 beta 2 以上
  • iOS 9 beta2 以上
  • 支持 HTTPS 的域名

操作

添加域名到 Capabilities -> Associated Domains

在 Xcode 的 Capabilities 里,打开 Associated Domains 开关,并添加需要绑定的域名, 必须用 applinks: 为前缀。可以添加一些子域和扩展(www.domain.com, news.domain.com 等等)。

Associated Domains

如果正常,可以看到项目中会自动添加一个 entitlements 文件。

配置 apple-app-site-association 文件

新建一个文件名,命名为apple-app-site-association,然后编辑内容为一段 Json。

1
2
3
4
5
6
7
8
9
10
11
{
"applinks": {
"apps": [],
"details": [
{
"appID": "4MX4MNJ2AK.cn.dankal.SF",
"paths":[ "*" ]
}
]
}
}
Key Value
apps 必须为空数组
details 字典数组,每个app对应一个字典
appID 由前缀和ID两部分组成,可以在 developer.apple.com 中的 Identifiers → AppIDs 中点击对应的 App ID 查看。
paths 对应域名中的path,用于过滤可以跳转到App的链接,支持通配符‘*’,‘?’以及‘NOT’进行匹配,匹配的优先级是从左至右依次降低。

最后, 把这个文件上传到域名根目录。确保打开 https://domain.com/apple-app-site-association 如果可以看到或下载到该文件。

在 APP 里处理通用链接

为了在 APP 里支持通用链接,需要在 AppDelegate 里实现一个方法。

1
2
3
4
5
6
7
8
9
10
11
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
// 打开App后,做某些具体的视图跳转操作
// 如果需要获取链接的参数,可以通过userActivity.webpageURL.absoluteString拿到url字符串
// 然后再根据规则切割或者截取,获取到想要的参数值
// ...
return YES;
}
return NO; // 只打开App
}

通用链接工作流程图

工作流程图

补充

  1. apple-app-site-association 不需要 .json 后缀。

  2. 对 json 文件的请求仅在 App 第一次启动时进行,如果此时网络连接出了问题,apple 会缓存请求,等有网的时候再去请求,而实际测试抓包就算网络恢复了也没有请求,所以此时的通用连接会失效。

  3. paths 匹配的优先级是从左至右依次降低,但需要明确,否则会出问题。比如"paths":["NOT /together/*","*"],在 iOS 9.2 上 path 为 /together/* 都不会跳到 App,但是在 iOS 9.0 上会跳到 App,这就有问题了。

  4. 从 iOS 9.2 开始,在相同的 domain 内 Universal Links 是不起作用的,必须要跨域才能生效。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/30.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!