iOS中App未在后台时Universal Links无法跳转指定页面问题咨询
解决方案
冷启动场景Universal Links参数获取逻辑
Universal Links原生完全支持冷启动场景下的参数传递与跳转,你遇到的无法获取链接的问题,是因为冷启动时不会触发scene(_ scene: UIScene, continue userActivity: NSUserActivity)方法,链接参数会通过Scene生命周期的启动入口传递。
具体处理步骤如下:
- 在
SceneDelegate的scene(_:willConnectTo:options:)方法中获取链接参数
该方法是App冷启动创建Scene时的入口,Universal Links对应的NSUserActivity会存放在connectionOptions的userActivities集合中,示例代码:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 提取Universal Links对应的UserActivity guard let userActivity = connectionOptions.userActivities.first(where: { $0.activityType == NSUserActivityTypeBrowsingWeb }), let targetUrl = userActivity.webpageURL else { // 没有对应链接参数,走原有正常启动逻辑 guard let _ = (scene as? UIWindowScene) else { return } return } // 拿到链接后执行跳转逻辑,建议封装公共方法和后台场景复用 handleUniversalLinkJump(url: targetUrl) // 原有初始化逻辑 guard let _ = (scene as? UIWindowScene) else { return } }
- 复用跳转逻辑
将跳转指定页面的逻辑封装为公共方法,比如handleUniversalLinkJump(url: URL),后台场景触发scene(_:continue:)时也调用该方法,保证两种场景下处理逻辑一致。
额外注意事项
- 跳转逻辑需要保证App根控制器、首页栈初始化完成后再执行,避免因页面未加载完成导致跳转失效,可以根据业务场景选择加少量延迟,或者监听首页渲染完成的回调后再执行跳转
- 如果需要兼容iOS 13以下没有SceneDelegate的系统版本,需要在
AppDelegate的application(_:didFinishLaunchingWithOptions:)方法中,从launchOptions参数的UIApplication.LaunchOptionsKey.userActivityDictionary字段中提取对应的UserActivity处理 - 如果需要同时支持URL Scheme类型的深度链接,冷启动时可以从
connectionOptions.urlContexts中提取对应的Scheme链接进行处理
内容的提问来源于stack exchange,提问作者user2679041
相关产品推荐
相关产品推荐

