SceneDelegate中触发通用链接时如何跳转到CallbackViewController
解决方案
方案1:导航栈push跳转(最常用)
如果你的应用根控制器是UINavigationController,直接获取导航控制器执行push操作即可:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard let url = userActivity.webpageURL, url.lastPathComponent == "callback", let window = self.window, let navVC = window.rootViewController as? UINavigationController else { return } // 从Storyboard正确加载CallbackViewController let storyboard = UIStoryboard(name: "Main", bundle: nil) // 注意:这里的Identifier要和你Storyboard中CallbackVC的Storyboard ID保持一致 guard let callbackVC = storyboard.instantiateViewController(withIdentifier: "CallbackViewController") as? CallbackViewController else { return } // 避免重复push相同页面 if navVC.topViewController is CallbackViewController { return } // 执行push跳转 navVC.pushViewController(callbackVC, animated: true) }
使用前需要打开Main.storyboard,选中CallbackViewController,在身份检查器中将Storyboard ID设置为CallbackViewController
方案2:模态弹出页面
如果你的应用没有使用导航控制器,或者希望模态弹出Callback页,可以用这个方案:
首先添加一个获取当前顶层控制器的通用扩展(放在任意Swift文件中即可):
extension UIViewController { func topMostViewController() -> UIViewController { if let presented = self.presentedViewController { return presented.topMostViewController() } if let nav = self as? UINavigationController { return nav.topViewController?.topMostViewController() ?? self } if let tab = self as? UITabBarController { return tab.selectedViewController?.topMostViewController() ?? self } return self } }
然后修改SceneDelegate中的处理代码:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard let url = userActivity.webpageURL, url.lastPathComponent == "callback", let window = self.window, let topVC = window.rootViewController?.topMostViewController() else { return } let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let callbackVC = storyboard.instantiateViewController(withIdentifier: "CallbackViewController") as? CallbackViewController else { return } // 避免重复弹出 if topVC.presentedViewController is CallbackViewController || topVC is CallbackViewController { return } // 执行模态弹出 topVC.present(callbackVC, animated: true) }
额外注意事项
如果跳转时没有动画或者不生效,可以把跳转逻辑手动放到主队列执行,避免线程异常:
DispatchQueue.main.async { // 此处放push/present的跳转逻辑 }
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

