如果你的app支持了Universal Links, iOS用户点击你网站的链接可以直接打开已经安装的app, 而不用通过打开Safari, 如果你的app没有安装那么点击链接是通过Safari打开你的网站,
Universal Links为您提供了一些自定义Scheme方案无法获得的关键优势, 主要包括:
- 独特: 与自定义Scheme方案不同,其他应用无法声明通用链接,因为通用链接使用的是指向您网站的标准HTTP或HTTPS链接。
- 安全: 当用户安装您的app时,iOS会检查您已上传到网络服务器的文件,以确保您的网站允许打开您的应用。只有您可以创建和上传此文件,因此网站与应用程序的关联是安全的。
- 灵活: 即使未安装您的应用程序,Universal Links也可以使用。未安装您的应用程序时,点击链接会在Safari中打开。
- 简单: 一个URL既适用于您的网站,也适用于您的应用程序。
- 私密: 其他应用可以与您的应用通信,而无需知道您的应用是否已安装。
注意:
Universal links使用户可以在点击WKWebView和UIWebView 以及Safari页面中的网站链接时打开您的应用程序,此外例如在Mail,Messages和其他应用程序中出现的链接会调用openURL:不能实现Universal links效果。
当用户在Safari中浏览您的网站时,他们点击指向当前网页所在域中URL的Universal links,则iOS会尊重用户最有可能的意图,并在Safari中打开该链接。如果用户点击指向其他域中URL的Universal links,iOS将在您的应用中打开该链接。(相同域名的 在Safari中点击不会打开app)
对于运行9.0之前的iOS版本的用户,点击指向您网站的通用链接会在Safari中打开该链接。
支持 Universal links是容易的, 只需要三个步骤:
- 创建一个命名为 apple-app-site-association 的json文件 到你的app中
- 上传这个文件到你的HTTPS 服务器, 只能放置在根目录下或者 .well-known子目录下
- 做一些app的配置
然后 就可以使用 universal links了
创建/上传 关联文件
要在您的网站和应用之间建立安全连接,请在它们之间建立信任关系。
分两部分建立:
- 创建 apple-app-site-association 到你的网站
- 创建 com.apple.developer.associated-domains entitlement 到你的app
你可以通过Shared Web Credentials Reference 了解更多关于 app和website之间建立安全连接
注意:
如果你的app运行在iOS9+系统 并且使用HTTPS部署的 apple-app-site-association 文件, 你可以创建不用签名的json文件, 如果你app支持 Handoff 并且需要建立安全连接, 那么你需要对这个文件签名, 详情了解Shared Web Credentials Reference.
您需要为每个域提供一个单独的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文件中,指定网站中应被视为通用链接的路径以及不应被视为通用链接的路径。保持路径列表简短,并依靠通配符匹配来匹配较大的路径集。
下表显示了一个apple-app-site-association文件的示例,该文件标识了应作为通用链接处理的三个路径
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
注意:
不要在apple-app-site-association 后面拼.json
apple-app-site-association文件中的apps键必须存在
,其值必须为空数组
,如上表所示: details的值是字典的数组,您的网站支持的每个应用程序都有一个字典。数组中字典的顺序决定了系统在寻找匹配项时所遵循的顺序,因此您可以指定一个应用来处理网站的特定部分。
每个特定于应用程序的词典都包含一个appID键和一个path键。appID键的值是team ID 或者 app ID前缀,后跟bundle ID. (appID值与构建的entitlements后中的“ application-identifier”键相关联的值相同)paths键的值是一个字符串数组,用于指定网站所支持的部分该应用程序以及您不想与该应用程序关联的网站部分。要指定不应作为通用链接处理的区域,请在路径字符串的开头添加“ NOT”(在T后面包含空格)。例如,清单6-1中显示的apple-app-site-association文件可以通过更新路径数组来防止将网站的 /videos/wwdc/2010/* 区域视为通用链接,如下所示:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
由于系统按照指定的顺序查找path数组中的每个路径,并在找到正/负匹配时停止查找,因此您应在低优先级路径之前指定高优先级路径。请注意,仅将URL的path部分用于比较。其他query string or fragment identifier将被忽略。
- 使用
*
指定整个网站 - 包括特定的URL,例如/wwdc/news/,以指定特定的链接
- 添加
*
到特定的URL,例如 /videos/wwdc/2015/*,以指定网站的一部分
除了使用 *
匹配任何子字符串外,您还可以使用?
匹配任何单个字符。您可以将两个通配符合并在一个路径中,例如/foo/*/bar/201?/mypage
注意:
您用于在paths数组中指定网站路径的字符串区分大小写。
创建apple-app-site-association文件后,将其上传到HTTPS Web服务器的根目录
或.well-known子目录
。该文件需要通过HTTPS进行访问(无任何重定向
),网址为https://<domain>/apple-app-site-association
或 https://<domain>/.well-known/apple-app-site-association
。接下来,您需要处理应用程序中的通用链接。
App 中处理 Universal Links
通用链接使用两种技术:
第一种是为Web浏览器和本机应用之间的提供相同的powers Handoff ,
第二种是共享Web凭据(有关这些技术的更多信息,请参阅 Web Browser–to–Native App Handoff and Shared Web Credentials Reference)。
当用户点击Universal Links时,iOS将启动您的应用程序并向其发送一个NSUserActivity对象,您可以查询该对象以了解您的应用程序是如何启动的。
要在您的应用中支持通用链接,请执行以下步骤:
- 添加一个 你app支持的指定域的 entitlement文件
- 添加代理
-application:continueUserActivity:restorationHandler:
处理NSUserActivity
对象
在您的com.apple.developer.associated-domains
entitlement 文件中,包括您的应用程序希望作为通用链接处理的域的列表。为此,请在Xcode中打开the Associated Domains section in the Capabilities tab
,并为您的应用程序支持的每个域添加一个条目,并以applinks:为前缀,例如applinks:www.mywebsite.com。将此列表限制为不超过20到30个域。
要匹配关联域的所有子域,您可以通过在特定域的开头之前加*.来指定通配符(需要句号)。域匹配基于applinks条目中最长的子字符串。例如,如果您指定条目applinks:.mywebsite.com和applinks:.users.mywebsite.com,则针对较长的*.users.mywebsite.com条目执行域名emily.users.mywebsite.com的匹配。请注意,由于星号后有句号,因此*.mywebsite.com的条目与mywebsite.com不匹配。要同时为*.mywebsite.com和mywebsite.com启用匹配,您需要为每个网站提供单独的应用程序链接条目
指定关联的域后,实现的UIApplicationDelegate 方法(特别是 application:continueUserActivity:restorationHandler:),以便您的应用可以接收链接并对其进行适当处理。
当用户点击通用链接 启动您的应用程序时,您会收到an NSUserActivity object with an activityType value of NSUserActivityTypeBrowsingWeb.。活动对象的webpageURL属性包含用户正在访问的URL。网页URL属性始终包含HTTP或HTTPS URL,并且您可以使用NSURLComponents API来操纵URL的组件。
当用户点击您处理的universal link时,iOS还将检查用户的最新选择,以确定是否打开您的app或网站。例如,点击了universal link以打开您的应用程序的用户可以稍后通过点击状态栏中的breadcrumb按钮来选择在Safari中打开您的网站。用户做出选择后,iOS继续在Safari中打开您的网站,直到用户选择通过在网页上的the Smart App Banner中点击“OPEN”来打开您的应用程序。
注意
如果您实例化 SFSafariViewController, WKWebView, or UIWebView 对象以处理通用链接,则iOS会在Safari中打开您的网站,而不是打开您的应用程序。但是,如果用户从嵌入式SFSafariViewController,WKWebView或UIWebView对象中点击通用链接,则iOS会打开您的应用程序。
请务必理解,如果您的应用程序使用openURL:来打开指向您网站的universal link,则该链接不会在您的应用程序中打开。在这种情况下,iOS会识别出该事件来源于您的应用程序内,因此您的应用程序不应将其视为通用链接。
如果您在活动对象中收到无效的URL,请务必进行正常的失败。要处理不受支持的URL,您可以在共享应用程序对象上调用openURL:以在Safari中打开链接。如果您仍然无法打开链接,请向用户显示一条错误消息,说明发生了什么问题。
重要提示:
为了保护用户的隐私和安全,当您需要传输数据时,不应使用HTTP。而是使用安全传输协议,例如HTTPS。
接入验证:
- 通过 https://search.developer.apple.com/appsearch-validation-tool/ 可以验证配置的 apple-app-site-association 是否合法
- 在iOS设备中的备忘录中输入universal link,然后直接点击此链接,就会直接跳转到app。或是长按,在出现的弹出菜单中第二项是在’XXX’中打开,这也代表着成功
- 你将要测试的网址在safari中打开,在出现的网页上方(the Smart App Banner),可以看到有在”XX”应用中打开