Swift/Firebase:如何通过GIDSignIn检测Google登录用户持久状态
解决Google登录重启后GIDSignIn.currentUser为nil的问题
我完全懂你碰到的这个坑——Facebook登录重启后能靠AccessToken.current正常检测到用户,但Google这边GIDSignIn.sharedInstance()?.currentUser每次重启都变成nil,而且你明确想通过GIDSignIn本身来处理状态检测,不想直接用Firebase Auth。
问题核心在于:GIDSignIn不会自动恢复之前的登录会话,而Facebook的AccessToken默认是持久化并自动加载的。要让Google登录在重启后保持状态,你得手动调用restorePreviousSignIn()方法来恢复本地存储的会话。
修改后的完整CurrentSession代码
import Combine import FirebaseCore import FirebaseAuth import GoogleSignIn import FBSDKLoginKit import FBSDKCoreKit class CurrentSession: ObservableObject { @Published var userId: String? = nil init() { // 检查是否通过Facebook登录(原有逻辑保留) if AccessToken.current != nil { let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString) Auth.auth().signIn(with: credential) { (res,er) in if er != nil{ print((er?.localizedDescription)!) return } print("email: \(String(describing: res?.user.email))") print("name: \(String(describing: res?.user.displayName))") DispatchQueue.main.async { self.userId = String(describing: res?.user.displayName) } } } // 替换原有Google检测逻辑:手动恢复登录会话 GIDSignIn.sharedInstance()?.restorePreviousSignIn { [weak self] user, error in guard let self = self else { return } if let error = error { print("恢复Google登录失败: \(error.localizedDescription)") print("未找到当前用户") return } // 成功恢复用户后,获取认证信息并关联Firebase guard let user = user, let authentication = user.authentication else { print("未找到当前用户") return } let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken) Auth.auth().signIn(with: credential) { (res, err) in if err != nil { print("\(String(describing: err?.localizedDescription))") return } print("email: \(String(describing: res?.user.email))") print("name: \(String(describing: res?.user.displayName))") DispatchQueue.main.async { self.userId = String(describing: res?.user.displayName) } } } } }
关键细节说明
restorePreviousSignIn(completion:)会检查本地保存的Google登录凭据,尝试重新完成认证流程。成功后回调里的user就是当前登录用户,同时GIDSignIn.sharedInstance()?.currentUser也会被正确赋值。- 用
[weak self]是异步回调里的标准操作,避免循环引用导致内存泄漏。 - 保留了你原有的错误打印逻辑,方便调试时定位问题。
这样修改后,应用重启时Google的登录状态就能通过GIDSignIn正常恢复了。
内容的提问来源于stack exchange,提问作者eugene_prg
相关产品推荐
相关产品推荐

