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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:09:02