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中:
- 创建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)") // 处理链接逻辑 } } }
- 在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
相关产品推荐
相关产品推荐

