重新启动应用程序时,GIDSignIn.sharedInstance()。currentUser nil

时间:2016-10-03 11:24:29

标签: ios swift google-signin googlesigninapi

最初我检查是否有问题,看看我们是否已将数据保存到钥匙串中。我发现这篇文章并遵循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数据?

4 个答案:

答案 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'检查

  • True表示我们可以“ SignInSilently”,否则可以正常登录
  • 如果我们之后立即检查'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