iOS的UniversalLink的开发

在iOS 9之前,我们从外部启动App都是通过URL scheme的方式进行跳转,开发者通过配置info.plist文件中的 URL Types 可以轻松实现跳转,而且现在苹果还对这种跳转的方式加了一个提示框:“是否打开XXX”。

最近在做UniversalLink的开发过程中,遇到了一些坑,总结一下开发流程

1、打开Associated Domains服务

登录开发者账号,在Identifiers下AppIDs找到自己的App ID,编辑打开Associated Domains服务。 

2、在Xcode中开启Associated Domains服务

找到工程的Capabilities -> Associated Domains,打开此功能,在Domains中添加跳转域名,域名的格式为:

 注意事项:

(1)你的服务器必须支持SSL;
(2)Domains可以添加多个;
(3)Domains必须以 applinks: 开头;

3、配置 apple-app-site-association 文件

当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去GET定义的Domain下的apple-app-site-association文件。

官网链接:https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1

注意事项:

(1)apps项必须对应一个空的数组,details项对应一个字典的数组,其中appID对应项由前缀和ID两部分组成,可以在developer.apple.com中的Identifiers→AppIDs中点击对应的App ID查看。 

(2)paths对应域名中的path,用于过滤可以跳转到App的链接,支持通配符‘*’,‘?’以及‘NOT’进行匹配,匹配的优先级是从左至右依次降低。

(3)把配置好的json文件上传到服务器中该域名的根目录下,也就是说,我们可以用GET请求可以获取到这个apple-app-association文件。

(4) 需要留意iOS会先请求 https://domain.com/.well-known/apple-app-site-association

如果此文件请求不到,再去请求 https://domain.com/apple-app-site-association。 所以如果想要避免服务器接收过多GET请求,可以直接把apple-app-site-association放在./well-known/目录下。

4、Xcode代码处理
在AppDelegate中实现代理方法:
- (BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray* _Nullable))restorationHandler{
  if(![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
    return YES;
  }
  //读取url地址
  NSURL*jumpUrl = userActivity.webpageURL;
  // TODO:handle jump code
  return YES;
}
 
5、测试过程
(1)在备忘录或者短信中,输入之前定义的URL ,直接点击跳转到对应的App说明配置成功
(2)可以试下知乎 oia.zhihu.com,头条 m.toutiao.com,苹果也有自己的测试网站(https://search.developer.apple.com/appsearch-validation-tool/),但是我输入我的网址,显示error没有验证通过,但是却能正常跳转。知乎oia.zhihu.com,头条 m.toutiao.com 却显示验证通过。所以不能太相信这个网站。
 
 
6、敲黑板,画重点了

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

(2)如果要对没有path的域名进行支持(如:www.163.com),在json文件的paths中用通配符’*’是不行的,需要在paths数组中加入’/’进行匹配。

(3)对json文件的请求仅在App第一次启动或者更新版本时进行,如果此时网络连接出了问题apple会缓存请求,等有网的时候再去请求,而实际测试抓包并没有请求故通用连接会失效。

(4)paths匹配的优先级是从左至右依次降低,但需要明确,否则会出问题。比如"paths":[ "NOT /together/",""],在IOS9.2上path为/together/*都不会跳到App,但是在IOS9.0上会跳到。

(5)从iOS 9.2开始,在相同的domain内Universal Links是不work的,必须要跨域才生效,必须要跨域才生效,必须要跨域才生效。(这个是我遇到最大的坑。一只没注意这个,所以费了一番周折)。

posted @ 2018-04-20 00:17  我的style  阅读(521)  评论(0编辑  收藏  举报