公司的运维,发现最近大量的请求 /.well-known/apple-app-site-association这个文件,形成了大量的404,但是这是谁请求的呢?
实际上是苹果从iOS9.3开始更改了通用连接的请求文件的路径了
从原来的 /apple-app-site-association
到如今的/.well-known/apple-app-site-association
官网文档UniversalLinks文档中
Upload the apple-app-site-association file to your HTTPS web server. You can place the file at the root of your server or in the .well-known subdirectory.
今后之后,都不须要再上传到网站的根目录下了,而是目录.well-known下html
什么是Universal Links(通用连接)?
这是iOS9推出的一项功能,若是你的应用支持Universal Links(通用连接),那么就可以方便的经过传统的HTTP连接来启动APP(若是iOS设备上已经安装了你的app,不须要额外作任何判断等), 或者打开网页(iOS设备上没有安装你的app).或许能够更简单点来讲明,在iOS9以前,对于从各类从浏览器,Safari、UIWebView或者 WKWebView中唤醒APP的需求,咱们一般只能使用scheme.首先是app中注册某个scheme,例如html5
在网页中,ios
<a href="kaola://www.kaola.com">打开APP</a> <!-- 呼叫号码 --> <a href="tel://13788889999">打开拨号</a> <a href="sms:1-408-555-1212">打开系统的短信app</a>
可是这种方式有个很差的地方,就是须要提早判断系统中是否安装了可以响应此scheme的app,这个判断,网上不少,例如从浏览器或者Webview 中唤醒APP,如文章所描述的那样,不少网页中的判断是有问题的,常常会出现空白页,跳转不了等.更加悲催的是这种经过scheme方式来打开其它的app的方式,在微信中是被禁用了的.这意味着从微信的app中,是无法打开咱们的app的.git
Universal Links(通用连接):一条普通的http连接,例如https://yohunl.com/openApp, 当你支持通用连接的时候,系统中安装了你的app,那么用户点击连接,就直接进入到你的app中了,不管你是在微信中仍是在其它哪里!!! 当你没有安装的时候,你能够去到你指定的页面(你能够直接展现你原来的H5页面,也能够跳转到下载页等).也就是说,用户无需知道你是否安装了app,如 果安装了,这条连接就能够进app(进入你app了,你就能够以本地原生页面去展现信息给用户了),没有安装,就直接进原来的h5页面,对用户来讲,是一 个无缝的过程,很是顺畅!github
官方的说明文档web
你必须有一个域名,且这个域名的网站须要支持https,而后拥有网站的上传到根目录的权限(这个权限是为了上传一个apple指定的文件)json
{
"applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }
说明:
appID: 这里的组成方式是 teamId.yourapp’s bundle identifier.如上面的 9JA89QQLNQ,ABCD1234都是teamId,这个值从哪来的呢?
它是从的开发者帐户的我的中心来的,登录你的开发者中心
com.apple.wwdc是你的方式是 teamId.yourapp’s ,在你的xcode工程中
xcode
paths:
根据 paths 键设定一个你的app支持的路径列表,只有这些指定的路径的连接,才能被app所处理,举个例子:若是你的网站是www.yohunl.com
,你的path写的是”/support/*”,那么当用户点击www.yohunl.com/support/myDoucument
,就能够进入你的app了,相反www.yohunl.com/other 就不会.
path是大小写敏感的!
*号表示任意路径.浏览器
上传该文件apple-app-site-association到你的域名所对应的网站的根目录下(其实也不必定是根目录,例如ghost博客站点,就没有根目录一说,它就须要放在相应的主题目录下),这一步是为了苹果能从https://你的域名/apple-app-site-associationx
h获取到你上传的apple-app-site-association文件.
上传完后,本身先访问一下,看看是否可以获取到,用个人作例子,https://yohunl.com/apple-app-site-association ,当你点击这个连接,应该是下载apple-app-site-association文件.
验证该文件是否合法,苹果为了方便开发者,提供了一个网页来验证咱们编写的这个apple-app-site-association是否合法有效,验证网址,进入网站进行验证
安全
在xcode工程里进行一些配置
首先就是打开工程配置中的Associated Domains打开
在其中的Domains中填入你想支持的域名(这里不是随便填的,是能够支持你须要的Universal Links的域名), 必须以 applinks: 为前缀
例如个人填入的是
applinks:yohunl.com applinks:www.yohunl.com
苹果将会在合适的时候,从这里填入的域名请求文件apple-app-site-association
注意:当你打开Associated Domains后,xcode会在你的工程中添加.entitlements文件
而且若是你登录你的开发者中心,能够看到
,这些都是有助于你排除问题的.
到此,你的app就已经能够支持Universal Links(通用连接)了!!!
那么怎么测试呢?
在iOS设备中的备忘录中添加记事本或短信中输入App能识别的连接,而后直接点击此连接,就会直接跳转到你的app了
或是长按,在出现的弹出菜单中第二项是“在’XXX’中打开”,这也表明着成功。
或是你将要测试的网址放到safari中一个网页中,而后点击连接,在出现的网页上方,下滑,能够看到有 在”XX”应用中打开 (不少教程上说,在safari中直接点击,就会跳转到app,可是通过我实际验证,是不能够的,多是苹果又调整了一下策略吧)
在微信的网页浏览器中,也是能够的,虽然微信屏蔽了全部的custom scheme方式的跳转到其它app,可是Universal Links(通用连接)由于是普通的http连接,由系统直接处理的,微信屏蔽不了,这也就实现了从微信跳转到咱们的app!!
如今用户点击某个连接,直接能够进咱们的app了,可是,这不是咱们的最终目的,咱们的目的是要可以获取到用户进来的连接,根据连接来处理,须要展现给用户的信息
在工程里的 AppDelegate 里实现 方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *webpageURL = userActivity.webpageURL; NSString *host = webpageURL.host; if ([host isEqualToString:@"yohunl.com"]) { //进行咱们须要的处理 } else { [[UIApplication sharedApplication]openURL:webpageURL]; } } return YES; }
当 userActivity 是 NSUserActivityTypeBrowsingWeb 类型, 则意味着它是由Universal Links进来的,就能够添加咱们本身的处理逻辑了!
若是遇到不能起做用,http://stackoverflow.com/questions/32751225/ios9-universal-links-does-not-work上有讨论各类可能出现的问题 ,你能够去参考下