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,可以用通知机制触发视图控制器的跳转:
- 在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) }
- 在登录视图控制器中监听通知并处理跳转:
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
相关产品推荐
相关产品推荐

