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

iOS实现Google Sign In时报错:无法将AppDelegate转为预期UIViewController类型

报错原因

GIDSignIn.sharedInstance.signIn方法的presenting参数要求传入UIViewController类型的实例,作为弹出谷歌登录授权页面的宿主容器。你当前将signIn方法写在了AppDelegate类中,传入的self是AppDelegate类型,和要求的参数类型不匹配,因此触发类型转换报错。

解决方案

根据你的实际使用场景二选一即可:

  • 场景1:登录触发按钮是某个页面的UI控件
    直接将整段signIn方法从AppDelegate移动到对应页面的UIViewController子类中即可,此时presenting参数传入的self是符合要求的视图控制器实例,报错会直接消除。
    移动后的代码无需修改逻辑:
    @IBAction func signIn(sender: Any) {
      GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
        guard error == nil else { return }
    
        // 登录成功后跳转应用主内容页
      }
    }
    
  • 场景2:确实需要在AppDelegate中触发登录逻辑
    先获取当前App顶层正在显示的视图控制器,再将该实例传给presenting参数即可。
    示例代码如下:
    // 辅助方法:获取当前顶层显示的UIViewController
    func getTopViewController() -> UIViewController? {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let rootViewController = windowScene.windows.first?.rootViewController else {
            return nil
        }
        var topVC = rootViewController
        while let presentedVC = topVC.presentedViewController {
            topVC = presentedVC
        }
        return topVC
    }
    
    // 修改后的signIn方法
    @IBAction func signIn(sender: Any) {
        guard let topVC = getTopViewController() else { return }
        GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: topVC) { user, error in
            guard error == nil else { return }
    
            // 登录成功后跳转应用主内容页
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:36:03