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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:17:40