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

调用GIDSignIn.restorePreviousSignIn()后currentUser仍为nil的问题求助

解决GoogleSignIn restorePreviousSignIn后currentUser为nil的问题

问题核心在于GIDSignIn.sharedInstance.restorePreviousSignIn()是异步操作,你当前的代码在调用后立刻同步检查currentUser,此时异步操作还未完成,所以会得到nil。不要用加延迟这种不可靠的办法,正确做法是通过代理回调监听登录恢复的结果。

解决步骤:

  1. 实现GIDSignInDelegate代理
    遵循GIDSignInDelegate协议,实现signIn(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)方法,登录恢复成功或失败都会触发这个回调,在这里处理用户信息逻辑。

  2. 设置GIDSignIn的代理
    在App启动时(比如AppDelegate的application(_:didFinishLaunchingWithOptions:)方法里)设置代理:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GIDSignIn.sharedInstance.delegate = self
        return true
    }
    
  3. 调整原有代码逻辑
    移除调用restorePreviousSignIn()后立刻检查currentUser的代码,全部逻辑移到代理方法中:

    // 触发恢复登录的逻辑保留,但不要同步检查currentUser
    if GIDSignIn.sharedInstance.hasPreviousSignIn() && GIDSignIn.sharedInstance.currentUser == nil {
        GIDSignIn.sharedInstance.restorePreviousSignIn()
    } else {
        print("无历史登录记录或用户已存在")
    }
    
    // 实现代理方法处理结果
    func signIn(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            print("恢复登录失败: \(error.localizedDescription)")
            return
        }
        // 登录恢复成功,这里可以安全访问currentUser或传入的user参数
        if let currentUser = GIDSignIn.sharedInstance.currentUser {
            print("用户恢复登录成功: \(currentUser.profile?.name ?? "")")
            // 后续业务逻辑写在这里
        }
    }
    

关键说明:

  • 绝对不要依赖同步检查currentUser来判断restorePreviousSignIn的结果,必须通过代理回调处理异步操作的完成状态。
  • 确保项目已正确配置GoogleSignIn的基础设置(如Info.plist中的URL Scheme、客户端ID等),配置错误也会导致恢复登录失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:50:31