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

Google登录成功后无法跳转至其他视图控制器的技术咨询

问题解答

结论

跳转逻辑不应该放在AppDelegate中,正确的做法是将其放在带有登录按钮的视图控制器里,或者通过通知、闭包等方式让负责登录界面的视图控制器处理跳转操作。

为什么AppDelegate里的代码没反应?

你在AppDelegate中调用self.inputViewController?.performSegue(...)没效果,核心原因是inputViewController这个引用大概率是nil——AppDelegate本身并不持有登录视图控制器的有效引用,强行调用自然不会有任何响应。而且从职责划分来说,AppDelegate是负责应用生命周期管理的类,不该承担界面跳转这类UI层的逻辑。

两种可行解决方案

方案1:把登录逻辑直接移到登录视图控制器

将GIDSignInDelegate的实现从AppDelegate转移到登录VC中,登录成功后直接在VC内部执行跳转:

import UIKit
import Firebase
import GoogleSignIn

class LoginViewController: UIViewController, GIDSignInDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置当前VC为Google登录代理
        GIDSignIn.sharedInstance()?.delegate = self
    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            print(error)
            return
        }

        guard let authentication = user?.authentication, let idToken = authentication.idToken else {
            return
        }

        let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
        
        Auth.auth().signIn(with: credential) { [weak self] authResult, error in
            guard let self = self else { return }
            if let error = error {
                print(error.localizedDescription)
                return
            }
            // 登录成功直接执行跳转
            self.performSegue(withIdentifier: "goToMain", sender: self)
        }
    }
}

同时保持AppDelegate里的基础配置(Firebase初始化、clientID设置、URL回调处理)即可。

方案2:通过通知让视图控制器处理跳转(适合必须在AppDelegate处理登录逻辑的场景)

如果登录逻辑必须留在AppDelegate,可以用通知机制触发视图控制器的跳转:

  1. 在AppDelegate的登录成功回调中发送通知:
Auth.auth().signIn(with: credential) { authResult, error in
    if let error = error {
        print(error.localizedDescription)
        return
    }
    // 发送登录成功通知
    NotificationCenter.default.post(name: NSNotification.Name("GoogleLoginSuccess"), object: nil)
}
  1. 在登录视图控制器中监听通知并处理跳转:
class LoginViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 添加通知监听
        NotificationCenter.default.addObserver(self, selector: #selector(handleLoginSuccess), name: NSNotification.Name("GoogleLoginSuccess"), object: nil)
    }

    @objc func handleLoginSuccess() {
        performSegue(withIdentifier: "goToMain", sender: self)
    }

    // 记得销毁时移除监听
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

内容的提问来源于stack exchange,提问作者Tony Yao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:06:29