GIDSignIn.sharedInstance()?. currentUser在启动应用程序后的前几秒钟返回nil(先前已登录用户)

塔曼·帕纳(Parth Tamane)

我有一个布局基于的应用UINavigationControllers此应用程序具有一个具有表视图的RootVC,单击其单元格会将用户带到不同的视图控制器。

RootVC
| --- MainVC
| --- DiscussionsVC(是它GIDSignIn.sharedInstance()的委托和presentingViewController)
| --- InfoVC

在所有子视图控制器viewDidLoad方法中,我添加了以下打印语句:

print("Google User (View Controller Name): ", GIDSignIn.sharedInstance()?.currentUser)

最初,MainVC被压上viewVillAppearRootVC,使其成为第一个屏幕对用户可见。的值currentUser是零的RootVCMainVC但是,如果我回到RootVC并导航至InfoVCDiscussionsVC,则currentUser不是nil于是,我就使第一次提出的VC InfoVC,现在currentUsernil在那里。所以我改变了代码,适用于打印MainVCcurrentUser没有nil了。

DispatchQueue.main.asyncAfter(deadline: .now() + 30) {
   print("Google User (Main VC): ", GIDSignIn.sharedInstance()?.currentUser)
}

我认为这需要一些时间的价值currentUser不被nil所以我有两个问题:

  1. 检查之前需要等待的适当时间 currentUser
  2. 我可以添加一些内容来进行currentUser瞬时设置吗?一些帖子建议添加此内容,但无济于事。
if(GIDSignIn.sharedInstance().hasPreviousSignIn()) {
    GIDSignIn.sharedInstance()?.restorePreviousSignIn()
}

编辑1

我尝试按照答案中的说明添加以下列表器,但user仍然nil需要很长时间。

Auth.auth().addStateDidChangeListener { (auth, user) in
    print("Auth state changed: \n AUTH: \n\(auth)\nUSER \n\(user)")
    if let user = user {
        print("User is not nil")
    }
}

这就是我最初登录用户的方式,firebase auth是否缺少某些内容?

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
            // ...
            if let error = error {
                // ...
                print("Error signing in")
                print(error)
                return
            }
            
            guard let authentication = user.authentication else { return }
            let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                           accessToken: authentication.accessToken)
            
            Auth.auth().signIn(with: credential) { (authResult, error) in
                if let error = error {
                    print("authentication error \(error.localizedDescription)")
                }
            }
            setUserProfileImage()
        }

编辑2

我认为在通过Firebase控制台启用Google登录后,它现在可以正常工作。尽管它在控制台中说默认情况下,iOS和Web都启用了Google sigin。

弗兰克·范普菲伦

这是预期的行为。Firebase身份验证基于长期刷新令牌和短期ID令牌的组合。启动应用程序后,Firebase将连接到服务器以获取新的ID令牌。进行此通话时,currentUseris nil

为了更好地响应用户身份验证状态,请使用有关获取当前用户的文档中所示的身份验证状态侦听器

Auth.auth().addStateDidChangeListener { (auth, user) in
  // ...
}

一旦(成功或失败)刷新ID令牌,Firebase将自动调用此回调。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档