• Apple App Site Association 文件背后的秘密和配置攻略
  • 发布于 2个月前
  • 314 热度
    0 评论
在 iOS 生态系统中,Apple App Site Association(AASA)文件扮演着至关重要的角色。它通过在你的 iOS 应用和网络域之间建立安全且经过验证的链接,实现了诸如通用链接(Universal Links)、共享网络凭证、Handoff 和 App Clips 等功能。不知道你有没有注意过,当你在手机浏览器上访问知乎、小红书或 YouTube 时,有些链接会让你继续留在浏览器中,而另一些则会直接跳转到对应的应用中?这背后的驱动力正是 AASA 文件。

AASA 文件的创建
Apple App Site Association 文件是一个配置文件,它定义了 URL 的处理方式,并指定它们是打开在浏览器中还是直接链接到应用程序内的内容。
以下是一个基本示例:
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "ABCDE12345.com.example.app",
        "paths": [
          "/",
          "/about-us/",
          "/products/*",
          "/services/detail/?id=*",
          "/news/article/*",
          "/promo/*",
          "NOT /private/",
          "NOT /settings/*",
          "*.html"
        ]
      }
    ]
  },
  "webcredentials": {
    "apps": ["ABCDE12345.com.example.app"]
  },
  "appclips": {
    "apps": ["ABCDE12345.com.example.app"]
  }
}
访问下边这些路径的请求都会将用户路由到应用程序中:
"/",
"/about-us/",
"/products/*",
"/services/detail/?id=*",
"/news/article/*",
...
而对于那些以 NOT 前缀的路径,系统将不会重新路由用户,允许体验继续在浏览器中进行:
"NOT /private/",
"NOT /settings/*",
...
部署 AASA 文件
当你准备好部署 AASA 文件时,需要将其托管在网站的根目录或 .well-known 目录下:
/apple-app-site-association
/.well-known/apple-app-site-association
注意:AASA 文件不应有文件扩展名。为了让内容分发网络(CDN)成功缓存此文件,它必须托管在可供所有 IP 地址和范围访问的域上,通过 HTTPS 提供文件,不重定向,并且不被访问策略阻止。你还应该确保服务器以 Content-Type: application/json 的形式提供文件,并且文件大小不超过 128KB。

当你首次托管 AASA 文件时,苹果的 CDN 将在 24 小时内获取它,这意味着它们将在文件发布的第一天内从你的服务器请求并缓存一份副本。根据苹果文档的说法,这个 24 小时的窗口仅与首次将文件放入苹果的 CDN 有关。随后的更新会在不同的时间间隔发生。

其实我们可以通过下边的链接看下其他公司的 AASA 文件是如何写的:
小红书:https://www.xiaohongshu.com/apple-app-site-association
知乎:https://www.zhihu.com/.well-known/apple-app-site-association

今日头条:https://www.toutiao.com/.well-known/apple-app-site-association


测试与验证
随着应用程序的迭代,你将需要修订 AASA 文件,以便为新的用户流程整合通用链接(Universal Link)。AASA 文件中的错误很常见,因此验证此文件的行为和语法成为流程中不可或缺的一部分。一旦被苹果的 CDN 确认,此文件中的任何错误都可能影响所有用户的通用链接行为——无论是新用户还是老用户。幸运的是,在更改到达苹果之前,有几种方法可以验证 AASA 文件的行为。

绕过 CDN
关联域支持一种备用模式,允许开发者通过绕过 CDN 直接从服务器获取文件,以验证修改后的 AASA 文件的行为。

要在 Xcode 项目中激活此模式:
前往 Signing & Capabilities -> Associated Domains
在域条目的末尾添加 ?mode=developer(例如:applinks:yourdomain.com?mode=developer)
现在,当你构建并运行应用程序时,它将直接从你的服务器检索更新的 AASA 文件。
在开发期间只能使用备用模式,你必须在将应用程序提交到 App Store 之前从关联域中删除后面这段字符串。

验证 AASA 文件配置
你可以使用以下工具来验证 AASA 文件的语法和配置:
Universal Link & Apple App Site Association Testing Tool[1]
这是一个免费的工具,用于验证和测试 Apple App Site Association(AASA)文件。确保你的通用链接配置正确,通过简单的链接创建、实时测试和团队协作功能简化 AASA 文件的故障排除。

官方查询方式
你可以通过访问以下网址检查苹果的 CDN 是否已获取文件的最新版本:
https://app-site-association.cdn-apple.com/a/v1/{YOUR_DOMAIN_HERE}
如果 CDN 确实具有文件的最新版本,那么任何新应用安装也将获得此最新版本。但是对于老用户,他们的设备每周只会检查一次更新的副本。重新安装应用程序将从 CDN 获取最新版本。实际上,AASA 文件的任何更改的推出周期是 CDN 刷新其缓存所需的时间与现有用户每周检查的时间相结合。

缓存更新时间
为了更好地理解缓存版本更新前剩余的时间,我们可以查看来自 CDN 的响应头中的 Cache-Control 字段。
Cache-Control 头由网络服务器使用,以决定浏览器和中间缓存(如 CDN)应该如何以及在多长时间内缓存文件的提供版本。
在 Facebook 和 Yelp 上,我们可以通过以下链接查看:
https://app-site-association.cdn-apple.com/a/v1/facebook.com
https://app-site-association.cdn-apple.com/a/v1/yelp.com
然后我们可以通过从 max-age 中减去 age 来确定缓存何时更新:

max-age:6 小时,缓存刷新时间为 17,760 秒 / 约 5 小时。
max-age:1 小时,缓存刷新时间为 3,112 秒 / 约 50 分钟。
在实际情况中,最短的 max-age 是 3,600 秒,即 1 小时,最长的是 21,600 秒,即 6 小时。

值得注意的是,苹果的 CDN 会覆盖原始网站指定的 Cache-Control 设置。例如,直接从 Yelp 访问 AASA 文件的 max-age 为 1200,但从苹果的 CDN 检索时,其 max-age 为 3600。通过更长时间的缓存文件,苹果能够最大限度地减少对原始服务器的请求频率,从而减少网络和原始服务器的流量和负载。

总结
AASA 文件是 iOS 生态系统中一个非常重要的组件,它通过在 iOS 应用和网络域之间建立安全且经过验证的链接,实现了诸如通用链接(Universal Links)、共享网络凭证、Handoff 和 App Clips 等功能。通过了解 AASA 文件的创建、部署、测试与验证,开发者可以更好地优化其应用的链接配置,提升用户体验,并确保应用的稳定性和可靠性。

参考资料
[1]Universal Link & Apple App Site Association Testing Tool: https://getuniversal.link/?ref=digitalbunker.dev
用户评论