调用GIDSignIn.restorePreviousSignIn()后currentUser仍为nil的问题求助
解决GoogleSignIn restorePreviousSignIn后currentUser为nil的问题
问题核心在于GIDSignIn.sharedInstance.restorePreviousSignIn()是异步操作,你当前的代码在调用后立刻同步检查currentUser,此时异步操作还未完成,所以会得到nil。不要用加延迟这种不可靠的办法,正确做法是通过代理回调监听登录恢复的结果。
解决步骤:
实现GIDSignInDelegate代理
遵循GIDSignInDelegate协议,实现signIn(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)方法,登录恢复成功或失败都会触发这个回调,在这里处理用户信息逻辑。设置GIDSignIn的代理
在App启动时(比如AppDelegate的application(_:didFinishLaunchingWithOptions:)方法里)设置代理:func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { GIDSignIn.sharedInstance.delegate = self return true }调整原有代码逻辑
移除调用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
相关产品推荐
相关产品推荐

