已配置Universal Link但无法正常工作的技术求助
问题现象
已完成Apple深层Universal Link的全部配置,但通过备忘录测试URL或AirDrop将链接拖到安装了目标应用的设备时,链接会在Safari中打开,且未触发以下代理方法:
(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { NSLog(@"application openURL: %@", url); return true; }
已完成的配置
- 在「Signing & Capabilities」标签页中,将域名添加到App Transport Security(ATS)例外:
注:MyDomain.com是支持HTTPS的可用域名applinks:MyDomain.com?mode=developer - 为应用标识符启用「Associated Domains」,并使用了应用Bundle Identifier对应的App ID前缀
- 已在
https://<fully qualified domain>/.well-known/apple-app-site-association位置部署apple-app-site-association文件,内容如下:{ "applinks": { "details": [ { "appIDs": [ "MyAppIdentifer.MyBundleIdentifer" ], "paths": [ "*" ], "components": [ {"/": "/*"} ] } ] } } - 已通过AASA验证工具验证该文件(使用应用标识符、Bundle Identifier和域名)
异常发现
检查Apple CDN时,发现存在该文件的旧版本(缺少应用标识符前缀):
curl https://app-site-association.cdn-apple.com/a/v1/MyDomain.com
返回内容:
{ "applinks": { "details": [ { "appIDs": [ "MyBundleIdentifer" ], "paths": [ "*" ], "components": [ {"/": "/*"} ] } ] } }
注:已使用mode=developer标识且应用处于调试模式,理论上应直接从域名获取最新的apple-app-site-association文件,且该文件已能被Apple服务器识别,但问题仍存在
排查与解决建议
清理本地缓存与重装应用
即使开启mode=developer,设备仍可能存在旧缓存。尝试:- 重启设备并清除Safari浏览器缓存
- 完全卸载应用后重新安装,确保应用签名与Associated Domains配置完全匹配
修正AASA文件的AppID格式
appIDs的正确格式为TeamID.BundleID,确认MyAppIdentifer是Apple Developer后台中对应的Team ID(可在「Certificates, Identifiers & Profiles」页面查看)。若Team ID填写错误,即使文件部署正确也无法匹配应用。强制刷新Apple CDN缓存
修改apple-app-site-association文件内容(比如添加一个空格)后重新部署,触发Apple服务器重新抓取最新文件;也可通过开发者后台的Associated Domains相关工具手动发起刷新请求。补充实现正确的代理方法
iOS 13+中,Universal Link跳转优先触发application:continueUserActivity:restorationHandler:方法,而非application:openURL:options:。需补充实现该方法:- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *url = userActivity.webpageURL; NSLog(@"Universal Link opened: %@", url); // 处理跳转逻辑 } return YES; }验证ATS例外配置
确认ATS例外中的域名格式正确,不要携带https://或路径,需与AASA文件部署的域名完全一致。更换测试方式
避免直接在备忘录中点击链接(可能存在系统缓存),可尝试:- 在Safari中输入链接,下拉页面查看是否出现「在[应用名]中打开」的选项
- 使用命令
xcrun simctl openurl <deviceUDID> <yourUniversalLink>在模拟器中测试跳转
内容的提问来源于stack exchange,提问作者Jeshua Lacock

