重新启动应用时,Google SignIn不会保留凭据吗?

时间:2017-01-25 06:14:45

标签: ios google-signin google-sheets-api

我正在使用Google表格API和Drive API,并已将我的应用迁移到使用Google SignIn而非嵌入式webView身份验证。我能够成功登录用户并将身份验证传递给API服务,但是只要应用程序进入后台,它就不会保留凭据。以前,此代码只会从钥匙串重新加载凭据,并在需要时立即刷新令牌:

self.service.authorizer = 
           [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName
                                 clientID:kClientID
                                 clientSecret:nil];

但现在我需要使用AppDelegate中的以下代码检查密钥链中是否存在凭证:

if ([GIDSignIn sharedInstance].hasAuthInKeychain) {
    NSLog(@"Auth exists in keychain!");
    [[GIDSignIn sharedInstance] signInSilently];
} else {
    NSLog(@"No credentials in keychain!");
    [[GIDSignIn sharedInstance] signIn];
}

SignInSilently似乎需要一段时间,我需要暂停我的代码3秒钟,然后将凭据传递给我的API服务。从文档中看,似乎不再能够从钥匙串中保存和重新加载凭证了吗?

2 个答案:

答案 0 :(得分:0)

我意识到我没有正确使用Google SignIn回调方法。

(void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error

一旦登录完成,就会调用此方法,您可以从此处获取凭据。所以我刚刚从我的AppDelegate移入了我的viewcontroller并使我的viewcontroller成为GIDSignInDelegateGIDSignInUIDelegate的委托来接收回调。所以现在这个viewcontroller是我的启动屏幕启动登录,然后一旦完成就继续,因此删除我设置的任何静态延迟。
希望这可以帮助将来的某个人。

答案 1 :(得分: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