同一Target双Scheme下Universal Link staging环境无法跳转问题
看起来你已经把生产环境的Universal Link跑通了,但预发布环境掉链子了——我经手过不少这类问题,大概率是下面这些细节没处理到位,咱们一个个排查:
1. 预发布App ID的Associated Domains权限未开启
每个App ID都是独立的身份,你得登录苹果开发者后台,找到预发布环境对应的App ID,确认Associated Domains这个开关已经打开。如果这个权限没开,哪怕你在Xcode里加了关联域名,苹果也不会认可这个配置。
另外还要检查:这个App ID下有没有添加对应的applinks:your-staging-domain.com关联域名条目——有时候你在Xcode的Target层面全局加了,但开发者后台的App ID配置里漏加了,这也会直接导致不生效。
2. 预发布域名的apple-app-site-association文件配置错误
你提到每个域名的文件内容唯一,那一定要确认预发布环境的这个文件里,applinks字段下的apps数组,是不是正确填写了预发布App的Team ID + Bundle ID组合,格式是TEAM_ID.BUNDLE_ID(比如ABCDE12345.com.yourapp.staging)。
常见错误:把生产环境的Bundle ID写到预发布的文件里,或者Team ID写错了,这样苹果匹配不到预发布的App,自然不会触发跳转。
你可以用命令行直接拉取文件验证:
curl -v https://your-staging-domain.com/apple-app-site-association
看看返回的JSON里,apps数组的条目是不是和预发布App的身份完全一致。
3. Scheme与Build Configuration的关联配置有误
你的两个Scheme对应不同环境,要确认预发布Scheme关联的Build Configuration(比如Staging)里:
- Bundle Identifier确实是预发布环境的ID,不是生产的;
- Associated Domains设置里,确实包含了
applinks:your-staging-domain.com——有时候全局Target配置加了,但某个Configuration被单独覆盖,没加上这个域名。
你可以在Xcode里选中预发布Scheme,点击Edit Scheme,查看Run和Archive阶段的Build Configuration是不是正确关联到了预发布的配置,再去对应的Build Settings里检查Associated Domains。
4. 苹果CDN或设备端缓存问题
苹果会缓存apple-app-site-association文件,时长可能长达24小时,如果你刚更新了预发布的文件,苹果的CDN可能还没同步。另外,测试设备(或模拟器)也会缓存旧的配置,导致新配置不生效。
解决方法:
- 模拟器:用命令重置隐私缓存,然后删除App重新安装:
xcrun simctl privacy booted reset all - 真机:删除App,重启设备,或者去「设置」→「通用」→「还原」→「还原网络设置」(注意这会清除Wi-Fi密码);
- 可以用
curl -H "Cache-Control: no-cache" https://your-staging-domain.com/apple-app-site-association强制拉取最新文件,确认内容正确。
5. 预发布域名的HTTPS配置不达标
苹果对Universal Link的域名有严格要求:
- 必须使用有效的HTTPS证书(不能是自签名的,要受信任的CA颁发的);
- 访问
https://your-staging-domain.com/apple-app-site-association必须直接返回200状态码,不能有301/302重定向; - 文件的
Content-Type必须是application/json,不能是text/plain或者其他类型。
你可以用curl命令检查这些:
curl -I https://your-staging-domain.com/apple-app-site-association
看返回的HTTP/2 200和Content-Type: application/json是不是都符合要求。
6. 测试方式不正确
别直接在Safari地址栏输入链接然后跳转——Safari会优先在浏览器打开,不会触发Universal Link。正确的测试方式是:
- 把链接放到备忘录、短信里,点击打开;
- 用命令行给模拟器/真机发测试链接:
# 模拟器 xcrun simctl openurl booted https://your-staging-domain.com/test-path # 真机(需要先连接电脑,知道UDID) xcrun simctl openurl <device-udid> https://your-staging-domain.com/test-path
另外,还要确认你的App已经实现了UIApplicationDelegate的application:continueUserActivity:restorationHandler:方法(或者UIWindowSceneDelegate的scene:continueUserActivity:),虽然这是处理跳转后的逻辑,但如果完全没实现,可能也会影响跳转触发。
内容的提问来源于stack exchange,提问作者R.Sap

