当你支持通用链接的时候,iOS9的用户可以通过点击一个链接进入到你的APP中打开你的网站。如果你的APP未被安装,这个链接将会在Safari上面打开。这将会取代以前需要Safari进行条转的模式。
相对于自定义URL链接,通用链接提供了以下几个关键的改进。
唯一 不像自定义url,通用链接不可能被其余APP所声明,因为他们使用的是标准的HTTP或者HTTPS链接到你的网站。
安全 当用户安装你的APP的时候,iOS 会检测你上传到你的web服务器的一个文件来确保你的网站允许你的APP去打开你的URL和它的文件。只有你可以生成和上传这个文件,所以你的网站和你的APP的链接是安全的。
流畅 即使你的APP没有被安装,通用链接仍然可以工作。此时,点击一个你网站的链接,iPhone会在Safari上面展示你的内容,正如用户所希望那样。
简单 一个URL链接就可在你的网站和你的APP上面工作。
专用 无论你的APP是否被安装,其他APP都可以与你的APP进行交互。
注意
通用链接允许iOS9用户在WKWebView、UIWebView 和Safari页面上点击链接从而打开应用。此外,就是会导致程序调用的openURL,如在邮件上、短信上或者其他APP上的链接。
对于那些iOS版本低于9.0的用户,点击通用链接会在Safari上面打开你的页面。
支持通用链接其实是十分简单的。你只需要以下三个步骤
创建"apple-app-site-association"文件,文件中用JSON格式标明你的APP会处理的链接。
上传'apple-app-site-association'文件到你的HTTPS网页服务器。
让你的app可以处理通用链接。
切记要用真实的设备去测试通用链接,因为模拟器并不支持通用链接。
为了在你的网站和你的服务器之间创建一个安全的的链接,你需要在他们之间建立一个可信的关系。你建立的关系包括两部分:
在你的网站中添加'apple-app-site-association'文件
在你的APP中添加'com.apple.developer.associated-domains'授权。(这一部分你可以参考让你的APP为通用链接就绪) 你可以阅读共享网络凭据参考来了解怎样让你的网站和APP之间共享依据。
注意
如果你的APP在iOS9或者更新的版本上运行,并且,你使用HTTPS去提供你的'apple-app-site-association'文件,你可以利用'application/json'的MIME类型创造一个新的空白文件并且你不需要为他进行签名。但是如果你也支持iOS8的话,你仍然需要像共享网络依据那样去签名。
你需要为你的APP所支持的每个域名提供一个单独的'apple-app-site-association'文件。例如,'apple.com'和'developer.apple.com'就需要不同的'apple-app-site-association'文件,因为这些域名会提供不同的内容。相反,'apple.com'和'www.apple.com'并不需要不同的网站关联文件,因为他们提供的都是相同内容。
在你的'apple-app-site-association'文件中,你需要指明你需要通用连接处理的网站路径。表6-1展示了如何在'apple-app-site-association'表明三个需要通用链接处理的路径。
表 6-1建立一个apple-app-site-association
如下
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "TeamID.BundleID2",
"paths": [ "*" ]
}
]
}
}
注意
不要在你的'apple-app-site-association'文件名上加入'.json'拓展名
在'apple-app-site-accociation'文件中,你必须要使用'apps'字段,并且他的值必定是一个数组,就像表6-1演示的那样。'details'字段对应的是一个由字典组成的数组,每个字典均对应一个由你网站支持的app。字典在数组中的排列顺序就是系统查找匹配的顺序,所以你要明确好你的app处理你网站中的哪一个部分。
每一个APP指定的字典都包括'appID'和'paths'字段。'appID‘对应的是app的team ID和bundle ID,'paths'字段对应的是一个字符串数组,里面标注着你网站中允许该app支持的部分和禁止这个app关联的部分。为了明确某一个部分不能被通用链接处理,你需要加上NOT
这个关键字,并且在NOT与路径之间需要留有一个空格。例如,在表6-1的十里里,我们可以通过如下的改写,来禁止通用链接处理/videos/wwdc/2010/*
部分
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
因为系统是按照'paths'数组的顺序来执行,并且在遇到一个“允许执行”的匹配或者“禁止执行”的匹配时停下。因此,你需要将优先级较高的路径放在前面。要注意的是,只有url中的路径部分会被识别,其他诸如查询符或者路径标示符等都会被忽略。
有很多种方法可以用于在'apple-app-site-association'文件中表明你的网站路径,例如:
*
来标明整个网站/wwdc/news/
,来标明一个特定的链接。*
,例如/videos/wwdc/2015/*
来标明是你的网站的一部分出了使用*
来匹配任何字符串,你还可以使用?
来匹配单个字符,你可以结合使用两个通配符在一个路径上,例如/foo/*/bar/201?/mypage
。
注意
在'path'字段中拟用于识别网站路径的字符串是大小写敏感的。
在你创建了'apple-app-site-association'文件后,上传他到你的HTTPS网站服务器的根目录。这个文件需要是可以通过https:///apple-app-site-association
直接访问到,并且不能有任何的重定向。接下来,你需要在你的app中处理通用链接。
通用链接使用了两种技术:第一种是与web浏览器和原生APP权限切换一样的机制,第二种是共享网络依据(如果要了解更多关于这个技术的资料,可以观看网页浏览器与原生APP切换和共享网络依据两篇文章)。当一个用户点击通用链接的时候,iOS启动你的app并且发送一个NSUserActivity对象来让你查询你的app是怎么启动的。
为了让你的app支持通用链接,你需要执行以下步骤
在你的com.apple.developer.associated-domains
授权文件里,你需要包括你的APP需要处理的通用链接列表。为此,在Xcode里面,你需要打开功能选项卡中的关联域名部分,然后添加你的APP支持的每一个域名,并且要添加applinks:
前缀,例如applinks:www.mywebsite.com
。
接下来,采用UIApplicationDelegate来进行切换(特别是application:continueUserActivity:restorationHandler:),然后你的app才能接收一个链接并且进行正确的处理。
当iOS在用户点击通用链接后启动你的app的时候,你会接收到一个NSUserActivity对象,它的activityType值是NSUserActivityTypeBrowsingWeb
。activity对象的webpageURL属性包含了用户触发的URL。webpageURL属性总是会包含一个HTTP或者HTTPS链接,所以你可以使用NSURLComponetsAPI去处理URL的组成。
当一个用户点击你处理的通用链接时,iOS会检测用户最近的操作来决定是打开你的APP还是网站。例如,一个用户曾经点击过可以打开你的APP的通用链接,然而他在状态栏中选择了在Safari中打开你的网站。在这个用户进行了这种选择后,iOS会继续在Safari上面打开你的网站,直到用户在Smart App Banner点击OPEN来打开你的app。
注意
如果你实例化了一个SFSafariViewController、WKWebView或者UIWebView对象来处理通用链接,iOS会在Safari上面打开你的网站而不是启动你的APP。然而,如果用户在一个内嵌的SFSafariViewController、WKWebView或者UIWebView上面点击通用链接,iOS会打开你的网页。
需要了解的是,如果你的app使用了openURL:来处理通用链接,这个链接会在Safari上面打开而不是重定向到你的app中。iOS认为这个请求是来自于你的app,因此他不会把他当作通用链接来进行处理。
如果你从activity对象接收到一个无效链接,做出一个优雅的失败反应是十分重要的。要处理一个不支持的url,你可以在共享应用程序对象上调用openURL:来在Safari上面打开链接。如果你不能进行调用,向用户展示一个错误信息来解释为什么会错误。
重要
为了保护用户的安全和隐私,你不应该再使用HTTP来传输信息,反之,你应该使用一个更安全的传输协议例如HTTPS
扫码关注w3ctech微信公众号
共收到0条回复