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

SwiftUI应用中Universal Links无法触发AppDelegate回调求助

解决Universal Links回调不触发的问题

核心原因:Scene架构下的回调路径变化

iOS 13+引入了Scene架构,SwiftUI默认的WindowGroup属于这一架构,此时Universal Links触发的NSUserActivity会传递给Scene相关的回调,而非AppDelegate中的application(_:continue:restorationHandler:)方法。


解决方法1:使用SwiftUI原生修饰符(推荐)

在你的WindowGroup或ContentView上添加onContinueUserActivity修饰符,直接处理Universal Links:

@main
struct XApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in
                    // 获取Universal Links的URL
                    guard let url = userActivity.webpageURL else { return }
                    print("Received universal link: \(url)")
                    // 在这里处理你的链接跳转逻辑
                }
        }
    }
}

这种方式无需额外配置SceneDelegate,符合SwiftUI的开发模式。

解决方法2:自定义SceneDelegate

如果需要更复杂的Scene级处理,可以自定义SceneDelegate并配置到Info.plist中:

  1. 创建SceneDelegate类:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
           let url = userActivity.webpageURL {
            print("Received universal link via SceneDelegate: \(url)")
            // 处理链接逻辑
        }
    }
}
  1. 在Info.plist中添加Application Scene Manifest配置:
    • 添加键Application Scene Manifest,类型为字典
    • 其中添加键Scene Configuration,类型为字典
    • 再添加键Application Session Role,类型为数组
    • 数组中添加一个字典,包含:
      • Delegate Class Name:值为你的SceneDelegate类名(如$(PRODUCT_MODULE_NAME).SceneDelegate)
      • Storyboard Name:SwiftUI应用通常留空

注意事项

  • 启用Scene架构的应用中,不要依赖AppDelegate的application(_:continue:)方法,该方法仅适用于iOS 12及以下或未启用Scene架构的应用。
  • 测试时记得清理应用缓存、重启设备,避免系统缓存旧的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:09:14