我正在使用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服务。从文档中看,似乎不再能够从钥匙串中保存和重新加载凭证了吗?
答案 0 :(得分:0)
我意识到我没有正确使用Google SignIn回调方法。
(void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error
一旦登录完成,就会调用此方法,您可以从此处获取凭据。所以我刚刚从我的AppDelegate移入了我的viewcontroller并使我的viewcontroller成为GIDSignInDelegate
和GIDSignInUIDelegate
的委托来接收回调。所以现在这个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