配置URL Scheme后,deeplink触发时application:openURL:options:未调用
排查iOS Deeplink未触发
application:openURL:options:的问题 我来帮你一步步排查这个问题,这种情况我自己开发时也碰到过好几次,咱们从最基础的点开始检查:
1. 确认deeplink的调用格式是否正确
很多时候问题出在链接拼写:
- 必须在Scheme后面加上
://,也就是你要在Safari里输入的是deeplink-test://,而不是只写deeplink-test(后者会被Safari当成搜索关键词) - 可以试试带路径的完整链接,比如
deeplink-test://home,测试是否能唤起App
2. 验证Info.plist的配置是否生效
Xcode的缓存偶尔会导致配置不更新,先做这几步:
- 执行
Cmd+Shift+Kclean工程,然后重新build到模拟器/真机 - 检查Xcode的
Build Phases -> Copy Bundle Resources,确认你的Info.plist在列表中 - 确认
URL identifier和App的Bundle ID完全一致,包括大小写(虽然Bundle ID不区分大小写,但严格一致能避免潜在问题) - 确认
URL Schemes数组里只有deeplink-test,没有多余的空格或拼写错误
3. 检查代码实现是否适配iOS版本
从iOS 13开始,苹果引入了SceneDelegate,如果你的项目启用了多场景支持,AppDelegate的application:openURL:options:可能不会被触发,所有deeplink会走到SceneDelegate的方法里:
Objective-C示例
// AppDelegate.m(兼容iOS12及以下) - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { NSLog(@"Received deeplink in AppDelegate: %@", url); // 这里写你的deeplink处理逻辑 return YES; } // SceneDelegate.m(iOS13+) - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { UIOpenURLContext *context = URLContexts.anyObject; NSURL *url = context.URL; NSLog(@"Received deeplink in SceneDelegate: %@", url); // 建议把处理逻辑抽成公共方法,让两个Delegate都调用 }
Swift示例
// AppDelegate.swift(兼容iOS12及以下) func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { print("Received deeplink in AppDelegate: \(url)") // 处理逻辑 return true } // SceneDelegate.swift(iOS13+) func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } print("Received deeplink in SceneDelegate: \(url)") // 调用公共处理方法 }
4. 换一种测试方式
Safari直接输入链接有时会有异常,试试这些更可靠的测试方法:
- 在Notes或Messages里输入
deeplink-test://,然后点击这个链接 - 用Xcode的
Debug -> Open URL...功能,输入deeplink-test://,看是否能唤起App并打印日志 - 针对模拟器,用终端命令:
xcrun simctl openurl booted deeplink-test://
5. 排除其他潜在冲突
- 检查Info.plist里的
LSApplicationQueriesSchemes数组:这个是用来查询其他App的Scheme,不需要添加自己的Scheme,但如果里面有错误的配置,可能间接影响,不过概率很低 - 确认App没有被系统限制:在设备的
设置 -> 你的App里,检查是否有异常的权限限制(不过一般不会影响deeplink)
按照上面的步骤排查,大概率能找到问题所在,先从链接格式和SceneDelegate的适配开始检查,这两个是最常见的坑。
内容的提问来源于stack exchange,提问作者Mark Molina
相关产品推荐
相关产品推荐

