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

iOS应用通过Firebase Dynamic Link打开时SceneDelegate方法未触发求助

核心问题定位

点击动态链接能打开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:35:02