Swift中Firebase动态链接唤起App后处理方法未触发问题
Firebase动态链接唤起App后无法获取链接参数问题修复
问题现象
- 已在Firebase平台创建动态链接,点击链接可正常唤起iOS端应用
- AppDelegate中实现的动态链接处理函数完全未执行,控制台无对应打印输出,无法读取链接携带的参数完成应用内跳转
- 测试环境为连接Mac的iPhone真机,未使用iOS模拟器
原有实现代码
AppDelegate中通用链接处理逻辑:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { print("Handeling dynamic link") if let incomingURL = userActivity.webpageURL { print("Incoming URL is \(incomingURL)") let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in guard error == nil else { print("Found an error! \(error!.localizedDescription)") return } if let dynamicLink = dynamicLink { self.handleIncomingDynamicLink(dynamicLink) } } if linkHandled { return true } else { // Maybe do other things with our incoming url return false } } return false }
自定义链接参数处理方法:
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) { guard let url = dynamicLink.url else { print("That is weird. My dynamic link object has no url") return } print("Your incoming link parameter is \(url.absoluteString)") }
排查与修复步骤
- 适配SceneDelegate生命周期(90%以上该问题都是这个原因)
如果项目最低支持iOS 13+且默认使用SceneDelegate管理生命周期,系统不会调用AppDelegate的application(_:continue:restorationHandler:)方法,需要在SceneDelegate中实现对应回调处理通用链接:func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL else { return } print("Incoming URL is \(incomingURL)") DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { dynamicLink, error in guard error == nil else { print("Found an error! \(error!.localizedDescription)") return } if let dynamicLink = dynamicLink { self.handleIncomingDynamicLink(dynamicLink) } } } - 校验Associated Domains配置
- 登录苹果开发者后台,找到对应App ID,开启Associated Domains权限,重新生成并下载描述文件导入Xcode
- 打开Xcode项目的Signing & Capabilities页,添加Associated Domains配置项,填入规则
applinks:你的Firebase动态链接域名(不要带https前缀,例如域名为xxx.page.link则填applinks:xxx.page.link)
- 补充冷启动场景的链接处理
应用被杀死状态下点击动态链接唤起时,不会走上面的continue回调,需要在启动方法中补充处理逻辑:- 未使用SceneDelegate的项目,在AppDelegate的
application(_:didFinishLaunchingWithOptions:)中添加:if let activityDict = launchOptions?[.userActivityDictionary] as? [String: Any], let userActivity = activityDict["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity, userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL { DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in guard error == nil, let link = dynamicLink else { return } self.handleIncomingDynamicLink(link) } } - 使用SceneDelegate的项目,在
scene(_:willConnectTo:options:)中添加对应判断逻辑,从connectionOptions中获取userActivity后处理即可
- 未使用SceneDelegate的项目,在AppDelegate的
- 基础配置校验
- 确认
FirebaseApp.configure()在应用启动的最早时机调用,不要延迟执行 - 确认Firebase控制台创建动态链接时填写的iOS Bundle ID,和本地调试安装包的Bundle ID完全一致
- 首次测试时可在备忘录中长按动态链接,选择「在XX应用中打开」完成系统关联绑定,后续点击即可正常跳转触发回调
- 确认
调试提示:不要直接在微信、钉钉等内置浏览器中点击动态链接测试,这类应用会拦截通用链接跳转逻辑,优先使用系统备忘录、信息App存放测试链接。
内容的提问来源于stack exchange,提问作者Simon Gudiksen
相关产品推荐
相关产品推荐

