iOS应用通过Firebase Dynamic Link打开时SceneDelegate方法未触发求助
Firebase Dynamic Link 回调不触发问题排查与解决
核心问题定位
点击动态链接能打开App,但SceneDelegate的scene(_:willConnectTo:options:)、scene(_:continue:)等方法未触发,仅看到后台提示,大概率是回调逻辑遗漏或场景状态对应回调未处理导致。以下是具体排查和修复步骤:
1. 区分App状态对应的回调逻辑
- 冷启动(App完全未运行):点击链接会触发
scene(_:willConnectTo:options:),需从connectionOptions.userActivities中提取动态链接 - 热启动(App在后台):点击链接会触发
sceneWillEnterForeground(_:)和scene(_:continue:),不会触发scene(_:willConnectTo:options:)
你的代码只实现了基础的URL解析,但未对接Firebase Dynamic Links的官方解析逻辑,且冷启动场景的动态链接处理完全缺失。
2. 修复SceneDelegate的动态链接处理逻辑
热启动场景(scene(_:continue:))
添加Firebase官方解析方法,替换原有代码:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { print("3333") guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL else { return } // 交给Firebase解析动态链接 DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { dynamicLink, error in guard error == nil, let dynamicLink = dynamicLink, let targetURL = dynamicLink.url else { print("解析动态链接失败: \(error?.localizedDescription ?? "未知错误")") return } // 处理解析后的目标URL print("动态链接目标地址: \(targetURL)") let components = NSURLComponents(url: targetURL, resolvingAgainstBaseURL: true) print("path = \(components?.path ?? "")") print("params = \(components?.queryItems ?? [])") } }
冷启动场景(scene(_:willConnectTo:options:))
在窗口初始化前添加动态链接检查逻辑:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { print("0000") // 冷启动时检查动态链接 if let activity = connectionOptions.userActivities.first(where: { $0.activityType == NSUserActivityTypeBrowsingWeb }), let incomingURL = activity.webpageURL { DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { dynamicLink, error in guard error == nil, let dynamicLink = dynamicLink, let targetURL = dynamicLink.url else { print("冷启动解析动态链接失败: \(error?.localizedDescription ?? "未知错误")") return } print("冷启动动态链接目标地址: \(targetURL)") } } // 原有窗口初始化代码 if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = UIViewController() window.makeKeyAndVisible() } }
3. 检查Info.plist的Scene配置
确保Application Scene Manifest正确关联SceneDelegate,避免系统找不到回调类:
<key>UIApplicationSceneManifest</key> <dict> <key>UIApplicationSupportsMultipleScenes</key> <false/> <key>UISceneConfigurations</key> <dict> <key>UIWindowSceneSessionRoleApplication</key> <array> <dict> <key>UISceneClassName</key> <string>UIWindowScene</string> <key>UISceneDelegateClassName</key> <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string> <key>UISceneConfigurationName</key> <string>Default Configuration</string> </dict> </array> </dict> </dict>
4. 通用链接额外配置(若使用https类型动态链接)
在Xcode的Signing & Capabilities中添加Associated Domains,填入applinks:<你的动态链接域名>(例如applinks:yourapp.page.link),确保通用链接能正确跳转并触发回调。
5. 排除AppDelegate拦截
若AppDelegate中实现了application(_:continue:restorationHandler:),会导致iOS 13+系统优先调用AppDelegate的方法,而非SceneDelegate。如果不需要兼容iOS 12及以下版本,直接删除该方法即可。
内容的提问来源于stack exchange,提问作者eugene_prg
相关产品推荐
相关产品推荐

