Appy

免费开发者工具

通用链接验证器

确保链接能顺利打开你的应用。粘贴域名以检查 iOS Universal Links 与 Android App Links,并获得清晰的结果与修复步骤。

开始验证
粘贴域名或 URL,验证你的应用唤起配置。

工作原理

有人点你的链接时,到底发生了什么

两个平台都不会在点击那一刻去访问你的域名。它们在安装应用时就完成检查,把结果记下来,等有人点链接时直接使用。所以一个坏掉的文件可能好几天都没人发现,修好的文件也不会立刻生效。

iPhone 和 iPad

apple-app-site-association
  1. 安装时

    读取 Associated Domains

    iOS 查看应用 Associated Domains entitlement 中的 applinks: 条目。

  2. 安装时

    经由 Apple CDN 获取

    Apple 的 CDN 从你的域名下载文件,再把缓存副本交给设备。

  3. 点击时

    匹配链接

    iOS 把被点击的域名和路径与该文件中的 app ID 以及 paths 或 components 规则进行比对。

  4. 结果

    匹配成功:打开你的应用

    不匹配或没有文件:用 Safari 打开网页

Android

assetlinks.json
  1. 安装时

    读取 intent filter

    Android 找到为你的域名标记了 autoVerify 的 intent filter。

  2. 安装时

    获取 assetlinks.json

    在每个声明的主机上请求 /.well-known/ 下的这个文件,出现重定向即视为失败。

  3. 安装时

    核对签名证书

    文件中的包名和 SHA-256 指纹必须与签署已安装应用的证书一致。

  4. 结果

    验证通过:打开你的应用

    未通过验证:打开浏览器,旧版 Android 会弹出应用选择框

验证器检查的是这两条链路的服务器端:每个文件是否放在 iOS 和 Android 查找的位置,内容里是否有它们需要读取的信息。

检查项

这个工具检查什么

每次检查最多发出十个请求:你的域名及其带或不带 www 的另一个版本上的两个关联文件、Apple CDN 上的副本,以及 Google 的 Digital Asset Links API。具体看这些方面。

  • 两个位置,两个主机

    在你的域名和对应的 www 版本上,查找 /.well-known/ 与根目录下的 apple-app-site-association,以及 /.well-known/ 下的 assetlinks.json。

  • HTTPS 与 200 状态码

    报告每个请求的 HTTP 状态码,以及导致文件无法加载的超时和连接错误。

  • 重定向

    跟随重定向,显示每个请求最终落在哪里;如果最终地址在其他主机或是明文 HTTP,会给出提示。

  • 该是 JSON 却返回 HTML

    识别登录页、错误模板,或 Cloudflare、Akamai 等服务的人机验证页面,并显示返回的 Content-Type 响应头。

  • JSON 是否有效

    解析每个文件,失败时直接给出解析器的报错,方便你知道要改哪里。

  • applinks 与 app ID

    确认 applinks.details 存在,并列出其中所有 app ID。在“高级选项”里填入你的 App ID,可检查它是否在列表中。能识别签名(PKCS7)文件,但不解码。

  • relation 与包名

    检查 assetlinks.json 是否为包含 delegate_permission/common.handle_all_urls relation 的 JSON 数组,并列出包名。在“高级选项”里填入你的包名即可比对。

  • SHA-256 指纹

    把签名证书指纹粘贴到“高级选项”,验证器会在文件里查找它,带不带冒号都可以。

  • Apple 的副本与 Google 的视角

    读取 Apple CDN 下发给 iPhone 的副本,并询问 Google 的 Digital Asset Links API 在你的网站上找到了什么,方便你与服务器上的文件对比。

还没有这个文件,或者 JSON 解析报错?用 AASA 与 assetlinks.json 生成器生成

它看不到的部分

应用端:Associated Domains entitlement、intent filter、某个路径是否符合你的 paths 或 components 规则,以及某个应用内浏览器的具体行为。上线前请在真机上测试这些。

故障排查

为什么链接还是在浏览器里打开

绝大多数情况都能归到下面八种原因之一。服务器端的问题在验证器里就能看到,其余的只会在真机上出现。

  1. 01iOS + Android

    点击发生在 Instagram、Facebook 或 TikTok 里

    从备忘录或信息里点击正常,从主页简介或广告点击却打开网页。

    解决方法

    这些应用会在自己的应用内浏览器中打开链接,往往不会把地址交给 iOS 或 Android。请逐个渠道测试,并确保即使 App 没有打开,链接也能把人带到有用的地方,例如应用商店页面或你的网站。

  2. 02iOS + Android

    关联文件发生了重定向

    文件在浏览器里能正常打开,但验证失败。

    解决方法

    Apple 和 Android 都要求在准确的地址上直接返回 200。去掉 /.well-known/ 上从 http 到 https、从裸域名到 www 或按语言的重定向。

  3. 03iOS + Android

    Content-Type 不对

    文件能加载,但平台直接忽略它。

    解决方法

    两个文件都以 application/json 提供。AASA 文件没有扩展名,很多服务器会默认返回 application/octet-stream 或 text/plain。

  4. 04iOS

    Apple CDN 上还是旧文件

    文件已经修好,iPhone 仍然打开 Safari。

    解决方法

    Apple CDN 提供的是缓存副本,会落后于你的服务器;验证器会同时显示两者。测试期间,在 entitlement 后加上 ?mode=developer,并在设备的开发者设置中打开 Associated Domains Development。

    验证器中可见通用链接完整指南
  5. 05Android

    缺少 Play 应用签名密钥

    自己打的包能打开应用,从 Play 商店安装的却打开浏览器。

    解决方法

    启用 Play App Signing 后,用户安装的应用由 Google 签名。把 Play Console“应用完整性”中应用签名密钥证书的 SHA-256 加进去;如果还在 Play 之外分发,也保留上传密钥的指纹。

  6. 06iOS

    链接指向当前页面所在的域名

    网站上的按钮打开的是更多网页,而不是应用。

    解决方法

    用户点击指向当前所在域名的通用链接时,iOS 会让他留在 Safari。把应用链接放到单独的子域名,或在网站上使用 Smart App Banner。

    需在真机测试通用链接完整指南
  7. 07iOS

    用户曾经选择过 Safari

    链接在你的手机上正常,在同事的手机上不行。

    解决方法

    应用打开后点右上角的域名,会让 iOS 以后对该域名优先使用 Safari。要恢复,长按链接并选择在应用中打开。

  8. 08iOS

    App ID 与构建版本不符

    测试环境的构建能用,正式发布的构建不行。

    解决方法

    条目必须是 Team ID 加上已发布应用的准确 bundle ID,例如 ABCDE12345.com.example.app。在“高级选项”里填入,验证器会帮你核对。

    验证器中可见通用链接完整指南

省掉这些折腾

做出开箱即用的链接

Appy 链接会识别每一次点击,把它送到对的地方:iPhone 去 App Store,Android 去 Google Play,电脑去你的网站。在 Pro 套餐开启深度链接后,已安装应用的用户会直接进入应用。

  • 免费套餐
  • 无需信用卡
  • 所有套餐不限点击
  • 取消订阅后链接照常可用

Enterprise 套餐会为你的应用分配专属链接域名,并由 Appy 在上面托管 apple-app-site-association 和 assetlinks.json。 了解 SDK 如何工作

常见问题

什么是 apple-app-site-association(AASA)文件?

放在你域名上的一个 JSON 文件,用来告诉 iOS 哪些应用可以打开哪些链接。它位于 https://你的域名/.well-known/apple-app-site-association,没有 .json 扩展名,列出你的 app ID(Team ID 加 bundle ID)以及它们处理的 paths 或 components 规则。

关联文件必须放在哪里?

iOS 读取 /.well-known/apple-app-site-association,Android 读取 /.well-known/assetlinks.json,链接里用到的每个主机都要有。两者都必须通过 HTTPS 直接返回 200,不能有重定向,并使用 application/json 内容类型。

为什么通用链接打开的是 Safari 而不是我的应用?

要么验证失败了(文件缺失、被重定向或无效,或 app ID 与构建版本不符),要么是 iOS 有意选择了 Safari:点击来自应用内浏览器或同一域名的页面,或者用户曾经选择过 Safari。先运行验证器;如果没有问题,再在真机上测试这些情况。

为什么营销邮件里的链接打开的是浏览器而不是应用?

邮件服务商会把每个链接替换成自己域名上的点击追踪 URL。iOS 和 Android 只根据这第一个域名做判断,之后的重定向无法打开应用。把验证器切换到“邮件中的链接”,粘贴测试邮件中的链接:它会跟踪重定向,识别邮件服务商,并告诉你追踪域名需要做哪些配置。

怎样检查我的 assetlinks.json?

在上方输入你的域名,展开“高级选项”填入包名和 SHA-256 指纹。在测试手机上运行 adb shell pm get-app-links com.example.app,可以看到 Android 是否已把每个域名标记为已验证。

为什么 Android 提示 App Links 验证失败?

最常见的原因是 assetlinks.json 里的指纹来自你的上传密钥,而从 Play 商店安装的应用是用 Google 的应用签名密钥签名的。其次是重定向、内容类型错误,以及 /.well-known/ 前面的反爬保护。改好文件后,运行 adb shell pm verify-app-links --re-verify com.example.app。

Apple 多久能拿到修改后的 AASA 文件?

没有即时刷新。设备从 Apple CDN 获取文件,而 CDN 提供的是缓存副本,所以服务器上的修改需要一段时间才能生效。验证器会把 CDN 副本和你的文件并排显示。开发阶段在 entitlement 后加 ?mode=developer,设备就会直接从你的服务器获取文件。

通用链接在 Instagram、Facebook 或 TikTok 里能用吗?

经常不行。这些应用会在自己的应用内浏览器中打开链接,点击能否到达你的应用取决于具体应用和投放位置。请逐个渠道测试,并确保你的网站或应用商店页面本身就是一个合格的落地页。

验证器会检查我的应用、entitlement 或路径吗?

它读取的是你的服务器、Apple CDN 和 Google Digital Asset Links API 返回的内容。对于邮件中的链接,它还会检查 AASA 文件中的规则是否覆盖这个链接。应用端,也就是 Associated Domains entitlement 和 intent filter,需要在真机上测试。

深度链接和通用链接有什么区别?

深度链接泛指任何能打开应用内特定页面的链接。iOS 的 Universal Links 和 Android 的 App Links 是经过验证的那一类:普通的 HTTPS 地址,已安装应用时打开应用,未安装时打开网页。

需要注册账号吗?可以分享检查结果吗?

不需要账号,验证器免费使用。每次检查都有独立的网址,可以复制后发给你的开发同事。这些结果页不会被搜索引擎收录。