Google SignIn не сохраняет учетные данные при перезапуске приложения?

Я использую Google Sheets 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. Из документации кажется невозможным просто сохранить и перезагрузить учетные данные из связки ключей?


person LurgenB    schedule 25.01.2017    source источник


Ответы (2)


Я понял, что неправильно использую метод обратного вызова Google SignIn.

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

Этот метод вызывается после завершения входа, и отсюда вы можете получить учетные данные. Поэтому я просто переместил вход из своего AppDelegate в свой контроллер просмотра и сделал свой контроллер просмотра делегатом для GIDSignInDelegate и GIDSignInUIDelegate для получения обратного вызова. Итак, теперь этот viewcontroller является моим стартовым экраном для запуска входа в систему, а затем для продолжения после его завершения, удаляя любые статические задержки, которые я установил.
Надеюсь, это поможет кому-то в будущем.

person LurgenB    schedule 29.01.2017

Недавно 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

person Rohit Pradhan    schedule 18.12.2019