我有一个布局基于的应用UINavigationControllers
。此应用程序具有一个具有表视图的RootVC,单击其单元格会将用户带到不同的视图控制器。
RootVC
| --- MainVC
| --- DiscussionsVC(是它GIDSignIn.sharedInstance()
的委托和presentingViewController)
| --- InfoVC
在所有子视图控制器viewDidLoad
方法中,我添加了以下打印语句:
print("Google User (View Controller Name): ", GIDSignIn.sharedInstance()?.currentUser)
最初,MainVC
被压上viewVillAppear
的RootVC
,使其成为第一个屏幕对用户可见。的值currentUser
是零的RootVC
和MainVC
。但是,如果我回到RootVC
并导航至InfoVC
或DiscussionsVC
,则currentUser
不是nil
。于是,我就使第一次提出的VC InfoVC
,现在currentUser
是nil
在那里。所以我改变了代码,适用于打印MainVC
和currentUser
没有nil
了。
DispatchQueue.main.asyncAfter(deadline: .now() + 30) {
print("Google User (Main VC): ", GIDSignIn.sharedInstance()?.currentUser)
}
我认为这需要一些时间的价值currentUser
不被nil
。所以我有两个问题:
currentUser
currentUser
瞬时设置吗?一些帖子建议添加此内容,但无济于事。if(GIDSignIn.sharedInstance().hasPreviousSignIn()) {
GIDSignIn.sharedInstance()?.restorePreviousSignIn()
}
我尝试按照答案中的说明添加以下列表器,但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()
}
我认为在通过Firebase控制台启用Google登录后,它现在可以正常工作。尽管它在控制台中说默认情况下,iOS和Web都启用了Google sigin。
这是预期的行为。Firebase身份验证基于长期刷新令牌和短期ID令牌的组合。启动应用程序后,Firebase将连接到服务器以获取新的ID令牌。进行此通话时,currentUser
is nil
。
为了更好地响应用户身份验证状态,请使用有关获取当前用户的文档中所示的身份验证状态侦听器:
Auth.auth().addStateDidChangeListener { (auth, user) in
// ...
}
一旦(成功或失败)刷新ID令牌,Firebase将自动调用此回调。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句