iOS 9
以前,一直使用的是URL Schemes
技术来从外部对App
进行跳转,可是iOS
系统中进行URL Schemes
跳转的时候若是没有安装App
,会提示Cannot open Page
的提示,并且当注册有多个scheme
相同的时候,目前没有办法区分,可是从iOS 9
起可使用Universal Links
技术进行跳转页面,这是一种体验更加完美的解决方案git
什么是Universal Link
(通用连接) Universal Link
是Apple
在iOS 9
推出的一种可以方便的经过传统HTTPS
连接来启动APP
的功能。若是你的应用支持Universal Link
,当用户点击一个连接时能够跳转到你的网站并得到无缝重定向到对应的APP
,且不须要经过Safari
浏览器。若是你的应用不支持的话,则会在Safari
中打开该连接github
支持Universal Link
(通用连接) 先决条件:必须有一个支持HTTPS
的域名,而且拥有该域名下上传到根目录的权限(为了上传Apple
指定文件)web
集成步骤json
开发者中心配置 找到对应的App ID
,在Application Services
列表里有Associated Domains
一条,把它变为Enabled
就能够了 api
工程配置 targets->Capabilites->Associated Domains
,在其中的Domains
中填入你想支持的域名,必须以applinks:
为前缀,如:applinks:domain
跨域
配置指定文件 建立一个内容为json
格式的文件,苹果将会在合适的时候,从咱们在项目中填入的域名请求这个文件。这个文件名必须为apple-app-site-association
,切记没有后缀名
,文件内容大概是这样子:浏览器
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
复制代码
appID
:组成方式是TeamID.BundleID
。如上面的9JA89QQLNQ
就是teamId
。登录开发者中心,在Account -> Membership
里面能够找到Team ID
paths
:设定你的app
支持的路径列表,只有这些指定路径的连接,才能被app
所处理。*
的写法表明了可识别域名下全部连接bash
上传该文件 上传该文件到你的域名所对应的根目录
或者.well-known目录
下,这是为了苹果能获取到你上传的文件。上传完后,先访问一下,看看是否可以获取到,当你在浏览器中输入这个文件连接后,应该是直接下载apple-app-site-association
文件服务器
代码中的相关支持 当点击某个连接,能够直接进咱们的app
,可是咱们的目的是要可以获取到用户进来的连接,根据连接来展现给用户相应的内容,咱们须要在工程里实现AppDelegate
对应的方法:app
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
// NSUserActivityTypeBrowsingWeb 由Universal Links唤醒的APP
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){
NSURL *webpageURL = userActivity.webpageURL;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"api.r2games.com.cn"]){
//进行咱们的处理
NSLog(@"TODO....");
}else{
NSLog(@"openurl");
[[UIApplication sharedApplication] openURL:webpageURL options:nil completionHandler:nil];
// [[UIApplication sharedApplication] openURL:webpageURL];
}
}
return YES;
}
复制代码
苹果为了方便开发者,提供了一个网页验证咱们编写的这个apple-app-site-association
是否合法有效
Universal Link
跨域 Universal Link
有跨域问题,Universal Link
必需要求跨域,若是不跨域,就不会跳转(iOS 9.2
以后的改动) 假如当前网页的域名是A
,当前网页发起跳转的域名是B
,必需要求B
和A
是不一样域名才会触发Universal Link
,若是B
和A
是相同域名,只会继续在当前WebView
里面进行跳转,哪怕你的Universal Link
一切正常,根本不会打开App
Universal Link
请求apple-app-site-association
时机当咱们的App
在设备上第一次运行时,若是支持Associated Domains
功能,那么iOS
会自动去GET
定义的Domain
下的apple-app-site-association
文件
iOS
会先请求https://domain.com/.well-known/apple-app-site-association
,若是此文件请求不到,再去请求https://domain.com/apple-app-site-association
,因此若是想要避免服务器接收过多GET
请求,能够直接把apple-app-site-association
放在./well-known
目录下
服务器上apple-app-site-association
的更新不会让iOS
本地的apple-app-site-association
同步更新,即iOS
只会在App
第一次启动时请求一次,之后除非App
更新或从新安装,不然不会在每次打开时请求apple-app-site-association
Universal Link的好处
Custom URL scheme
是自定义的协议,所以在没有安装该app
的状况下是没法直接打开的。而Universal Links
自己就是一个可以指向web
页面或者app
内容页的标准web link
,所以可以很好的兼容其余状况Universal links
是从服务器上查询是哪一个app
须要被打开,所以不存在Custom URL scheme
那样名字被抢占、冲突的状况Universal links
支持从其余app
中的UIWebView
中跳转到目标app
Universal link
给别的app
进行app
间的交流时,对方并不可以用这个方法去检测你的app
是否被安装(以前的custom scheme URL
的canOpenURL
方法能够)