w3ctech

支持通用链接

点击查看原文

当你支持通用链接的时候,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用户在WKWebViewUIWebView 和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'文件中表明你的网站路径,例如:

  • 利用*来标明整个网站
  • 引入特定的url,例如/wwdc/news/,来标明一个特定的链接。
  • 在路径上添加*,例如/videos/wwdc/2015/*来标明是你的网站的一部分

出了使用*来匹配任何字符串,你还可以使用?来匹配单个字符,你可以结合使用两个通配符在一个路径上,例如/foo/*/bar/201?/mypage

注意

在'path'字段中拟用于识别网站路径的字符串是大小写敏感的。

在你创建了'apple-app-site-association'文件后,上传他到你的HTTPS网站服务器的根目录。这个文件需要是可以通过https:///apple-app-site-association直接访问到,并且不能有任何的重定向。接下来,你需要在你的app中处理通用链接。

让你的App为通用链接就绪

通用链接使用了两种技术:第一种是与web浏览器和原生APP权限切换一样的机制,第二种是共享网络依据(如果要了解更多关于这个技术的资料,可以观看网页浏览器与原生APP切换共享网络依据两篇文章)。当一个用户点击通用链接的时候,iOS启动你的app并且发送一个NSUserActivity对象来让你查询你的app是怎么启动的。

为了让你的app支持通用链接,你需要执行以下步骤

  • 添加一个授权来明确你的app支持哪些链接
  • 更新你的应用程序代理让他能够在接收到NSUserActivity的时候作出恰当反应。

在你的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。

注意

如果你实例化了一个SFSafariViewControllerWKWebView或者UIWebView对象来处理通用链接,iOS会在Safari上面打开你的网站而不是启动你的APP。然而,如果用户在一个内嵌的SFSafariViewControllerWKWebView或者UIWebView上面点击通用链接,iOS会打开你的网页。

需要了解的是,如果你的app使用了openURL:来处理通用链接,这个链接会在Safari上面打开而不是重定向到你的app中。iOS认为这个请求是来自于你的app,因此他不会把他当作通用链接来进行处理。

如果你从activity对象接收到一个无效链接,做出一个优雅的失败反应是十分重要的。要处理一个不支持的url,你可以在共享应用程序对象上调用openURL:来在Safari上面打开链接。如果你不能进行调用,向用户展示一个错误信息来解释为什么会错误。

重要

为了保护用户的安全和隐私,你不应该再使用HTTP来传输信息,反之,你应该使用一个更安全的传输协议例如HTTPS

w3ctech微信

扫码关注w3ctech微信公众号

共收到0条回复