ios universal links原理 唤醒之后app怎么处理

ios9+&universal&links&详细教程
最近在做一个项目,需要一个分享页面(点击邀请打开app,还有一个下载链接),当点击接受邀请的时候,如果已经安装了app,直接打开app;如果没有安装,直接跳下载地址。
在ios 8 之前,我是使用动态添加 iframe和把url改成 url scheme 的方法来调用App,但是ios 9
以后,safari 不支持iframe的方法了,但是通过改变 url
的方式可以实现功能,那么问题来了,在safari
没有安装app的情况下,会报“url无效”的错误,在已安装的情况下,定时器又是一个新问题,总之是苦不堪言。
后来从苹果官网开发者中,看到苹果官网开发者文档中看到 universal
links的一篇文章,感觉看到了曙光。
和ios工程师讨论半天,都带着一头雾水去看,走了不少弯路,其他文档相对笼统,有很多地方介绍的不够详细,所以特在此发一篇文章,如果对大家有帮助最好,没人看就自己留着当笔记。
首先,我把要做的事情分为web端和移动端;
web端就2个需要解决的问题:
第一,网站必须要有SSL证书(也就是支持https);
第二,在网站根目录下放一个名为“apple-app-site-association”的json文件,去除后缀“.json”,换句话说可以通过/apple-app-site-association访问到该文件。
//&“apple-app-site-association”&内容区域
------------------------------------
"applinks":&{
"apps":&[],
"details":&{
".domain.App":&{
"paths":[&"*"&]
// END ------------------------
至于其他的问题,比如有些文档说要get 这个文件,那么怎么获得,是web获得还是移动端获取呢?
等等的问题,都可以不管,其他的就是苹果系统和ios工程师的问题了。
ios端 需要做的就多了
给大家分享2个链接,供参考
的/p/c2ca5b5f391f#
2. &的/ios/21.html
虽然写的烂,转载也声明出处!哈哈。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。iOS9 Universal Links踩坑之旅,移动应用之deeplink唤醒app - 简书
iOS9 Universal Links踩坑之旅,移动应用之deeplink唤醒app
参考文章:1.大招之 2.3.苹果验证通用链接是否可用的4.通用链接文件存放的server需要支持https
简单粗暴,有一个需求:
产品说从app内部分享出去的网页上要加一个打开按钮
有个页面还要有一个收藏按钮。
用户点击打开,能直接唤醒app跳转到这一页去浏览,
用户点击收藏,也能直接唤醒app直接在app内部收藏。
明确的需求就是:
手机打开我们的网站,点击打开按钮或者收藏按钮,
用户如果已经安装app,跳转到app做相应的操作。
如果没有安装app,则跳转到应用商店提示用户下载安装。
方法1: URL Scheme
holy 个 shit 啊,第一时间想到的是url scheme ,然后将参数配置在url scheme后面,唤醒app再进行页面跳转逻辑。
但残酷的现实是企鹅和微信都把url scheme 唤醒app这种方式给禁了。
方法2: meta标签
然后考虑了在网页上对meta 标签做手脚,可以实现类似下图的效果:
meta标签示例.jpeg
meta标签的格式如下:
&meta charset="UTF-8" name="apple-itunes-app" content="app-id=, affiliate-data=myAffiliateData, app-argument=yourScheme://"&
这样添加meta标签后的网页,使用safari打开的时候,就会在顶部显示自己app的导航条。如果没有安装app点击能够跳转到appstore去下载,如果安装了app就能直接通过顶部的meta标签唤醒app了。
Why Universal Links?
上面两种方式都能实现某一方面的需求,但无法完美解决。于是就想到了iOS9之后的Universal Links。
什么是Universal Links呢?
Universal Links就是一个通用链接,iOS9以上的用户,可以通过点击这个链接无缝的重定向到一个app应用,而不需要通过safari打开跳转。如果用户没有安装这个app,则会在safari中打开这个链接指向的网页。
如何支持Universal Links呢?
按照苹果官方文档来说,支持通用链接非常简单哟,只需要三步呢
1.创建一个名字叫做apple-app-site-association,包含固定格式的json文件
2.将这个文件上传到你的服务器,可以将这个文件放到服务器的根目录下,也可以放到.well-known这个子目录下。
3.配置app,然后在app里面添加代理方法
如果已经配置过Universal Links,那么在用户第一次安装app时,苹果会发送一个请求,请求你服务器上的apple-app-site-association文件。请求apple-app-site-association文件成功之后,用户就可以使用Universal Links唤醒app了。
1.apple-app-site-association文件
"applinks": {
"apps": [],
"details": [
"appID": "teamID.bundleId”,
"paths": ["/deaplink","/wwdc/news/","*"]
"appID": ".apple.wwdc",
"paths": [ "*" ]
创建一个包含上述格式的json文件,文件名字必须为apple-app-site-association,不能带后缀名,有的电脑设置的隐藏后缀名,这点需要注意。
appID 的 格式为 teamID.bundleId形式。
如何获取teamID呢?登录,找到Membership选项卡。
teamId.png
appID具体显示就是:<.mytest.app 这种
paths配置,实际上就是限制哪些路径可以唤醒app,哪些路径不能唤醒app。格式如下:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
使用*配置,则整个网站都可以使用
使用特定的URL,例如/wwdc/news/来指定某一个特殊的链接
在特定URL后面添加*,例如 /videos/wwdc/2015/*, 来指定网站的某一部分
除了使用*来匹配任意字符,你也可以使用 ?来匹配单个字符,你可以在路径当中结合这两个字符使用,例如 /foo/*/bar/201?/mypage
需要注意的是:配置的paths路径,是区分大小写的
验证apple-app-site-association文件
文件配置完成之后,将其上传到你的服务器根目录或者.well-known这个子目录下。
确保使用/apple-app-site-association这个链接可以访问到,<为你的服务器域名。
也可以使用,验证文件是否能被苹果请求到。如果是未上线的应用,使用验证网站时可能出现如下提示:
Validation Tool.png
-出现该提示为apple-app-site-association文件配置正确。-出现404错误码提示,则为apple-app-site-association文件未上传成功,或者使用/apple-app-site-association路径无法访问。
2.建立web网页和app应用之间的关联 -&
app IDs 配置 和 项目配置
app IDs 配置
进入,找到你自己的bundleId,可以点击edit按钮,开启associate domains,如下图:
associated domains.png
在项目的Capablities中开启Associated domains,如下图:
appLinks.png
注意domains可以添加多个,前缀必须为applinks:,applinks:后为你的服务器的域名。
代码接收Universal Links唤醒
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
NSLog(@"userActivity : %@",userActivityp.webpageURL.description);
return YES;
在appdelegate中实现上面这个方法,当使用Universal Links唤醒app时就执行这个方法。
3.验证配置快捷验证,在备忘录中输入/apple-app-site-association,长按这个链接,出现下图提示则配置成功。
successful.png
服务器必须要支持https,而且需要支持TLS1.2协议以上,不过相信苹果强制支持https之后,这个坑就会慢慢填上了。现在还有很多童鞋的服务器使用的免费的证书,或者证书不被苹果信任,然后就会导致无法下载apple-app-site-association。苹果支持的
只支持iOS9以上
apple-app-site-association文件名千万不能写错啊
使用charles抓包显示,只有初次安装app时才会去请求apple-app-site-association文件,所以测试时有可能因为网络波动导致apple-app-site-association文件获取失败。这种情况,多卸载几次,安装时使用4G。
验证各种配置的还有一个,需要打成ipa包丢上去。iOS 9上的网页唤醒APP(Universal Links) - 简书
iOS 9上的网页唤醒APP(Universal Links)
本文不介绍这些该死的东西是干什么的,只告诉你怎么用,言简意赅。当然,下面是必要条件
有一个注册的域名
通过 SSL 访问域名
支持上传一个 JSON 文件到你的域名
至少 iOS 9 beta 2 版本
至少 Xcode 7 beta 2
1.添加域名到 Capabilities首先, 你必须在 Xcode 的 capabilities 里 添加你的 APP 域名, 必须用 applinks: 前置它:还添加一些你可能拥有的子域和扩展(,
用 applinks: 前缀添加所有域名, 同时不要忘了包含所有可能需要的子域名。添加完了?工程里是不是多了一个这样的东西?
点开,记得在targetmembership内打钩。
然后,去 获取你的TeamId,很重要,当然,还需要你工程的Bundle Id。
创建一个json 格式的apple-app-site-associatio 文件如下:
"applinks": {
"apps": [],
"details": [
"appID": "TEAMID.Bundle Id",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
"appID": "TEAMID.BundleID2",
"paths": [ "*" ]
将TEAMID换成你从苹果开发者页面取出的TEAMID,Bundle Id则是上图中的Bundle Id。然后, 上传这个文件到你的域名根目录。打开验证页面,查看配置的内容是否通过如果都是通过的则可进行下一步
Paste_Image.png
若有一项未通过,则需要逐步排查问题一般情况下是json头部文件有问题,或是服务器不支持SSL协议
最后,appdelegate中
application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
Paste_Image.pngiOS9上的Universal Link实现(教程) - 推酷
iOS9上的Universal Link实现(教程)
1.Universal Link
理解为苹果官方支持deeplink就行了
2.通过点击HTTP链接启动APP
Web?iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自己起动应用
?App已经安装的前提下:直接启动App然后现实链接内容
?App没有安装的前提下:Web上继续显示链接内容
3.Universal Link的实现方法
首先需要准备一下内容
?独立的domain
?被签名的JSON文件
?Xcode 7?iOS 9 SDK
?Capabilities
?AppDelegate的代理设置
3.1&Capabilities的设置
在Capabilities的设置中,设置`Associated Domains’的Domains内容
注意:对于subdomain,www的有无要仔细考虑一下
3.2 apple-app-site-association文件的配置
apple-app-site-association文件一定要放在服务器的根目录下!!!!!!
首先要准备一下apple-app-site-association文件
&applinks&: {
&apps&: [],
&details&: {
&.domain.App&: {
&paths&:[ &*& ]
paths中的内容为对应App启动的链接路径
全路径的时候使用“*”。
特定位置的时候需要指定具体内容,
[&/wwdc/news/&, /videos/wwdc/2015/*]
<.domain.App这部分使用的是你的TeamID和Bundle Identifier
3.3 对apple-app-site-association文件的签名
我使用的是以下的方法对apple-app-site-association进行签名。
cat apple-app-site-association-unsigned.js | openssl smime -sign -inkey g01-server.key -signer g01-server.crt -certfile  g01-dvcacert.cer -noattr -nodetach -outform DER & apple-app-site-association
3.4 App对应的开发
在 AppDelegate.m文件中添加以下代码
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
NSLog(@&continueUserActiity enter&);
NSLog(@&\tAction Type : %@&, userActivity.activityType);
NSLog(@&\tURL
: %@&, userActivity.webpageURL);
NSLog(@&\tuserinfo :%@&,userActivity.userInfo);
NSLog(@&continueUserActiity exit&);
restorationHandler(nil);
NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:userActivity.webpageURL];
NSLog(@&COOKIE{name: %@&, cookies);
如代码所示,我们可以获取到跳转链接的一些基本信息
URL内容,ActionType等都是可以获取并且在代码中进行修改的。
通过以上的配置后,一个基础的Universal Link应用就开发结束了
点击对应的链接我们可以看到自己的App被成功启动
5.一些事实
相同的服务器不同的目录结构可能导致Universal Link不启动
应用和json文件同时更新时,json更新的部分可能会没有效果
如果需要使用我的服务器和app进行测试的同时可以私信我。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Universal Links(通用链接)
什么是Universal Links(通用链接)?
这是iOS9推出的一项功能,如果你的应用支持Universal Links(通用链接),那么就能够方便的通过传统的HTTP链接来启动APP(如果iOS设备上已经安装了你的app,不需要额外做任何判断等), 或者打开网页(iOS设备上没有安装你的app).或许可以更简单点来说明,在iOS9之前,对于从各种从,Safari、UIWebView或者 WKWebView中唤醒APP的需求,我们通常只能使用scheme.首先是app中注册某个scheme,例如
打开的短信app
但是这种方式有个不好的地方,就是需要提前判断系统中是否安装了能够响应此scheme的app,这个判断,网上很多,例如从浏览器或者Webview 中唤醒APP,如文章所描述的那样,很多网页中的判断是有问题的,经常会出现空白页,跳转不了等.更加悲催的是这种通过scheme方式来打开其它的app的方式,在微信中是被禁用了的.这意味着从微信的app中,是没法打开我们的app的.
Universal Links(通用链接):一条普通的http链接,例如/openApp,当你支持通用链接的时候,系统中安装了你的app,那么用户点击链接,就直接进入到你的app中了,无论你是在微信中还是在其它哪里!!! 当你没有安装的时候,你可以去到你指定的页面(你可以直接展示你原来的H5页面,也可以跳转到下载页等).也就是说,用户无需知道你是否安装了app,如果安装了,这条链接就可以进app(进入你app了,你就可以以本地原生页面去展示信息给用户了),没有安装,就直接进原来的h5页面,对用户来说,是一个无缝的过程,非常顺畅!
Universal Links(通用链接)的优点
唯一性: 不像自定义的scheme,因为它使用标准的http/https链接到你的web站点,所以它不会被其它的app所声明.另外,Custom URL scheme 因为是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的,而 universal links 本身是一个 HTTP/HTTPS 链接,所以有更好的兼容性 安全:当用户的手机上安装了你的app,那么iOS将去你的网站上去下载你上传上去的说明文件(这个说明文件声明了你的app可以打开哪些类型的http链接).因为只有你自己才能上传文件到你网站的根目录,所以你的网站和你的app之间的关联是安全的. 可变:当用户手机上没有安装你的app的时候,Universal Links也能够工作.如果你愿意,在没有安装你的app的时候,用户点击链接,会在safari中展示你网站的内容. 简单:一个URL链接,可以同时作用于网站和app 私有 其它app可以在不需要知道你的app是否安装了的情况下和你的app相互通信.
怎么支持Universal Links(通用链接)
你必须有一个域名,且这个域名的网站需要支持https,然后拥有网站的上传到根目录的权限(这个权限是为了上传一个apple指定的文件)
支持Universal Links(通用链接)
创建一个json格式的命名为apple-app-site-association文件,注意这个文件必须没有后缀名,文件名必须为apple-app-site-association!!!
&applinks&: {
&apps&: [],
&details&: [
&appID&: &.apple.wwdc&,
&paths&: [ &/wwdc/news/&, &/videos/wwdc/2015/*&]
&appID&: &.apple.wwdc&,
&paths&: [ &*& ]
appID: 这里的组成方式是 teamId.yourapp&s bundle identifier.如上面的 9JA89QQLNQ,ABCD1234都是teamId,这个值从哪来的呢?
它是从的开发者账户的个人中心来的,登陆你的开发者中心
vcrHIHRlYW1JZC55b3VyYXBwJnJzcXVvO3MgLNTaxOO1xHhjb2RluaSzzNbQPGJyIC8+DQo8aW1nIGFsdD0="" src="/uploadfile/Collfiles/95.png" title="\" />
根据 paths 键设定一个你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理,举个例子:如果你的网站是,你的path写的是&/support/*&,那么当用户点击/support/myDoucument,就可以进入你的app了,相反/other 就不会.
path是大小写敏感的!
*号表示任意路径.
上传该文件apple-app-site-association到你的域名所对应的网站的根目录下(其实也不一定是根目录,例如ghost博客站点,就没有根目录一说,它就需要放在相应的主题目录下),这一步是为了苹果能从https://你的域名/apple-app-site-associationxh获取到你上传的apple-app-site-association文件.
上传完后,自己先访问一下,看看是否能够获取到,用我的做例子, ,当你点击这个链接,应该是下载apple-app-site-association文件.
验证该文件是否合法,苹果为了方便开发者,提供了一个网页来验证我们编写的这个apple-app-site-association是否合法有效,,进入网站进行验证
在xcode工程里进行一些配置
首先就是打开工程配置中的Associated Domains打开
在其中的Domains中填入你想支持的域名(这里不是随便填的,是可以支持你需要的Universal Links的域名), 必须以 applinks: 为前缀
例如我的填入的是
苹果将会在合适的时候,从这里填入的域名请求文件apple-app-site-association
注意:当你打开Associated Domains后,xcode会在你的工程中添加.entitlements文件
并且如果你登陆你的开发者中心,可以看到
,这些都是有助于你排除问题的.
到此,你的app就已经可以支持Universal Links(通用链接)了!!!
那么怎么测试呢?
测试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.
if ([host isEqualToString:@&&]) {
//进行我们需要的处理
[[UIApplication sharedApplication]openURL:webpageURL];
return YES;
当 userActivity 是 NSUserActivityTypeBrowsingWeb 类型, 则意味着它是由Universal Links进来的,就可以添加我们自己的处理逻辑了!
如果遇到不能起作用,/questions//ios9-universal-links-does-not-work上有讨论各种可能出现的问题 ,你可以去参考下
iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links) 苹果官方Universal Links iOS9 Universal Links 国外人列举的当前支持Universal Links的app和其apple-app-site-association文件 51个应用的文件列表 查看是否支持 Universal Links的苹果网站
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 universal links 失效 的文章

 

随机推荐