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