当您支持通用链接时,iOS用户可以点击链接到您的网站,并无缝地重定向到已安装的应用程序,而无需通过Safari。如果您的应用未安装,请点击您的网站的链接在Safari中打开您的网站。
通用链接为您提供了使用自定义URL方案时无法获得的几个主要优点。具体来说,通用链接是:
独特。与自定义网址方案不同,其他应用不能声明通用链接,因为它们使用标准的HTTP或HTTPS链接到您的网站。
安全。当用户安装您的应用程序时,iOS会检查您已上传到Web服务器的文件,以确保您的网站允许您的应用程序代表其打开URL。只有您可以创建和上传此文件,因此您的网站与您的应用程序的关联是安全的。
灵活。即使您的应用程序未安装,Universal links也可以正常工作。当您的应用程序未安装时,点击链接到您的网站会按照用户期望在Safari中打开内容。
简单。一个URL适用于您的网站和您的应用程序。
私人的。其他应用程序可以与您的应用程序通信,而无需知道您的应用程序是否已安装。
注意
通用链接可让用户在点击链接到您的网站WKWebView,UIWebView浏览和Safari页面之前打开您的应用程序,以及导致呼叫的链接openURL:,例如邮件,邮件和其他应用程序中发生的链接。
当用户在Safari中浏览您的网站,并点击与当前网页位于同一个域中的URL的通用链接时,iOS会尊重用户最有可能的意图,并在Safari中打开链接。如果用户点击不同域中的URL的通用链接,则iOS会在您的应用中打开链接。
对于运行9.0之前的iOS版本的用户,点击通用链接到您的网站将在Safari中打开链接。
添加对通用链接的支持很容易。您需要采取以下三个步骤:
创建一个apple-app-site-association包含您的应用程序可以处理的URL的JSON数据的文件。
将apple-app-site-association文件上传到您的HTTPS Web服务器。您可以将文件放在服务器的根目录或.well-known子目录中。
准备您的应用程序来处理通用链接。
您可以测试设备上的通用链接。
创建和上传关联文件
要在您的网站和您的应用程序之间建立安全的连接,您将建立它们之间的信任关系。你建立这种关系的两个部分:
apple-app-site-association您添加到您的网站的文件
一个com.apple.developer.associated-domains您添加到您的应用程序的权利(这部分中描述的准备您的应用程序以处理通用链接)
您可以了解有关应用程序和网站如何在“共享Web凭据参考”中共享凭据的更多信息。
注意
如果您的应用程序在iOS 9或更高版本中运行,并且使用HTTPS来投放该apple-app-site-association文件,则可以创建使用application/jsonMIME类型的纯文本文件,而不需要对其进行签名。如果您在iOS 8中支持切换和共享网络凭据,则仍需要按照“共享Web凭据参考”中所述对文件进行签名。
您需要为apple-app-site-association您的应用程序支持的独特内容为每个域提供单独的文件。例如,apple.com并且developer.apple.com需要单独的apple-app-site-association文件,因为这些域提供不同的内容。相比之下,apple.com并且www.apple.com不需要单独的站点关联文件 - 因为两个域都提供相同的内容 - 但是这两个域都必须使该文件可用。对于在iOS 9.3.1及更高版本中运行的应用程序,apple-app-site-association文件的未压缩大小必须不大于128 KB,无论文件是否已签名。
在您的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": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
注意
不附加.json到apple-app-site-association文件名。
文件中的apps键apple-app-site-association必须存在,其值必须为空数组,如清单6-1所示。details密钥的值是一系列字典,您的网站支持的每个应用程序有一个字典。数组中字典的顺序决定了系统在查找匹配时遵循的顺序,因此您可以指定一个应用程序来处理网站的特定部分。
每个特定于应用程序的字典包含一个appID键和一个paths键。appID密钥的值是团队ID或应用ID前缀,后跟bundle ID。(该appID值与构建应用程序的权利中的“应用程序标识符”键相关联的值。)paths键的值是指定应用程序支持的网站部分的字符串数组以及您不想与应用程序关联的网站部分。要指定不应作为通用链接处理的区域,请在路径字符串的开头添加“NOT”(包括一个空格T)。例如,清单6-1apple-app-site-association所示的文件可能会阻止/videos/wwdc/2010/*通过更新paths数组来将网站的区域作为通用链接处理,如下所示:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
因为系统paths按照指定的顺序对阵列中的每个路径进行评估,并且在发现正或负匹配时停止评估 - 应在低优先级路径之前指定高优先级路径。请注意,只有URL的路径组件用于比较。其他组件(如查询字符串或片段标识符)将被忽略。
有多种方式可以在apple-app-site-association文件中指定网站路径。例如,您可以:
使用*指定整个网站
包括一个特定的URL,如/wwdc/news/指定一个特定的链接
附加*到特定的URL,例如/videos/wwdc/2015/*,指定您的网站的一部分
除了使用*匹配任何子字符串,您还可以使用?匹配任何单个字符。您可以在单个路径中组合两个通配符,例如/foo/*/bar/201?/mypage。
注意
用于指定paths阵列中的网站路径的字符串区分大小写。
创建apple-app-site-association文件后,将其上传到HTTPS Web服务器的根目录或.well-known子目录。该文件需要访问通过HTTPS,没有任何重定向,在https:///apple-app-site-association或https:///.well-known/apple-app-site-association。接下来,您需要处理应用程序中的通用链接。
准备您的应用程序处理通用链接
通用链接使用两种技术:第一种是与Web浏览器和本机应用程序之间切换功能相同的机制,第二种是共享Web凭据(有关这些技术的更多信息,请参阅Web浏览器到本机应用程序切换和共享Web凭据参考)。当用户点击通用链接时,iOS会启动您的应用程序并发送一个NSUserActivity可以查询的对象,以了解应用程序的启动方式。
要在您的应用程序中支持通用链接,请执行以下步骤:
添加一个指定您的应用程序支持的域的权利。
更新您的应用程序委托收到NSUserActivity对象时适当响应。
在您的com.apple.developer.associated-domains权利中,将应用程序要处理的域列表列为通用链接。要在Xcode中执行此操作,请打开“功能”选项卡中的“关联域”部分,并为您的应用程序支持的每个域添加一个条目,前缀applinks:如applinks:www.mywebsite.com。将此列表限制为不超过约20到30个域。
要匹配关联域的所有子域,您可以*.在特定域的开头之前通过前缀指定通配符(需要该时间段)。域匹配基于applinks条目中最长的子字符串。例如,如果您指定条目,applinks:*.mywebsite.com并且针对较长条目执行applinks:*.users.mywebsite.com域匹配。请注意,由于星号后的期间,条目不匹配。为了使两个匹配和,您需要提供一个单独的每个条目。emily.users.mywebsite.com*.users.mywebsite.com*.mywebsite.commywebsite.com*.mywebsite.commywebsite.comapplinks
指定关联的域后,请采用UIApplicationDelegateHandoff(特别是application:continueUserActivity:restorationHandler:)方法,以便您的应用程序可以接收链接并妥善处理。
当用户点击通用链接后,iOS启动您的应用程序时,您会收到NSUserActivity一个activityType值为的对象NSUserActivityTypeBrowsingWeb。activity对象的webpageURL属性包含用户正在访问的URL。网页网址属性始终包含HTTP或HTTPS网址,您可以使用NSURLComponentsAPI来操纵网址的组件。
当用户点击您处理的通用链接时,iOS还会检查用户最近的选择,以确定是否打开您的应用或您的网站。例如,一个利用通用链接打开应用程序的用户可以稍后在状态栏中点击导航痕迹按钮,选择在Safari中打开您的网站。用户进行此选择后,iOS会继续在Safari中打开您的网站,直到用户选择通过在网页上的智能应用横幅中点击OPEN打开您的应用程序。
注意
如果您实例化SFSafariViewController,WKWebView或UIWebView对象来处理通用链接,则iOS会在Safari中打开您的网站,而不是打开您的应用程序。但是,如果用户点击由嵌入在一个通用的链接SFSafariViewController,WKWebView或UIWebView对象,iOS版开启应用程式。
重要的是要明白,如果您的应用程序用于openURL:打开通用链接到您的网站,该链接不会在您的应用程序中打开。在这种情况下,iOS会识别该呼叫源自您的应用程序,因此您的应用程序不应被视为通用链接。
如果您在活动对象中收到无效的网址,那么重要的是正常失败。要处理不受支持的URL,您可以调用openURL:共享应用程序对象以在Safari中打开链接。如果您无法拨打此电话,则会向用户显示一条错误消息,以说明发生了什么。
重要
为了保护用户的隐私和安全,您不必在需要传输数据时使用HTTP;而是使用HTTPS等安全传输协议。