You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后处理即可
  • 基础配置校验
    • 确认FirebaseApp.configure()在应用启动的最早时机调用,不要延迟执行
    • 确认Firebase控制台创建动态链接时填写的iOS Bundle ID,和本地调试安装包的Bundle ID完全一致
    • 首次测试时可在备忘录中长按动态链接,选择「在XX应用中打开」完成系统关联绑定,后续点击即可正常跳转触发回调

调试提示:不要直接在微信、钉钉等内置浏览器中点击动态链接测试,这类应用会拦截通用链接跳转逻辑,优先使用系统备忘录、信息App存放测试链接。

内容的提问来源于stack exchange,提问作者Simon Gudiksen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:27:35