最初我检查是否有问题,看看我们是否已将数据保存到钥匙串中。我发现这篇文章并遵循BhavinBhadani的建议:
每当你检查([GIDSignIn sharedInstance] .hasAuthInKeychain)时, 在此之前添加你的标志范围..
https://github.com/googlesamples/google-services/issues/27
这解决了我的第一个问题GIDSignIn.sharedInstance().hasAuthInKeychain()
在用户成功登录之后返回true,然后杀死了app并重新运行。
但是现在我正在做以下事情:
let signIn = GIDSignIn.sharedInstance()
signIn.scopes = [Constants.GOOGLE_CLIENT_SCOPE, Constants.GOOGLE_OIDC_SCOPE]
if GIDSignIn.sharedInstance().hasAuthInKeychain() {
print("We have saved in keychain")
if let u = GIDSignIn.sharedInstance().currentUser {
getData(dataApi)
}
else {
// THIS CODE IS BEING SUCCESSFULLY HIT
GIDSignIn.sharedInstance().signInSilently()
getApplicationData(dataApi)
}
}
然而,即使在执行:GIDSignIn.sharedInstance().signInSilently()
之后,GIDSignIn.sharedInstance().currentUser
仍为零。
是否有人成功使用signInSilently()
再次填充currentUser数据?
答案 0 :(得分:3)
我在git中的那个问题中指出你还需要在检查hasAuthInKeychain
之前添加范围...这对我有用并希望对你有用
let signIn = GIDSignIn.sharedInstance()
signIn.scopes = ["https://www.googleapis.com/auth/plus.login","https://www.googleapis.com/auth/plus.me"]
if (signin.hasAuthInKeychain) {
print("Signed in");
} else {
print("Not signed in");
}
确保在
GIDSignIn.sharedInstance().signInSilently()
之后,调用getApplicationData(dataApi)
来填充数据会有一些延迟。
答案 1 :(得分:0)
您是否在删除应用后尝试了。在登录时,您可能无法将Keychain共享功能添加到应用程序。现在当你试图获得
if GIDSignIn.sharedInstance().hasAuthInKeychain()
它返回true但当前用户仍为零。
我遇到了同样的问题,所以删除了应用并再次登录。现在我可以看到当前用户。
答案 2 :(得分:0)
对我来说,诀窍是在功能中启用“钥匙串共享” 。
所以我的收据是:
设置范围
'hasAuthInKeychain'检查
如果我们之后立即检查'currentUser'会为空,那么在GIDSignInDelegate方法-didSignInFor用户中获取它的正确位置:
func authCheck() {
let signIn = GIDSignIn.sharedInstance()
signIn?.scopes = ["https://www.googleapis.com/auth/calendar"]
if GIDSignIn.sharedInstance().hasAuthInKeychain() {
// The user has either currently signed in or has previous authentication saved in keychain.
GIDSignIn.sharedInstance().signInSilently()
} else {
showLoginScene()
}}
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
withError error: Error!) {
if let error = error {
print("\(error.localizedDescription)")
} else {
// Now currentUser has value
guard let currentUser = GIDSignIn.sharedInstance().currentUser else {
print("currentUser is nil")
return nil
}
}}
答案 3 :(得分:0)
最近,Google更改了检查用户是否已经在Google SignIn SDK v5.0.0中登录的方法。
将调用更新为signInSilently并将hasAuthInKeychain更新为 restorePreviousSignIn和hasPreviousSignIn。
所以代码看起来像
if(GIDSignIn.sharedInstance().hasPreviousSignIn()) {
GIDSignIn.sharedInstance()?.restorePreviousSignIn()
} else {
navigateToLogin()
}
迁移指南:https://developers.google.com/identity/sign-in/ios/quick-migration-guide