Подтвердить что ты не робот

SignInSilently() генерирует код ошибки = -4

У меня есть этот случай, когда GIDSignIn.sharedInstance(). signInSilently() возвращает ошибку:

Ошибка домена = com.google.GIDSignIn Code = -4 "Операция не может быть завершено. (ошибка com.google.GIDSignIn -4.)"

Кажется, я не могу найти документацию об этой ошибке в документах google signin или stackOverflow.

Я ожидаю, что это произойдет, если я попрошу молчаливый signIn для ранее не подписанного пользователя. Но, к моему удивлению, это даже случается, когда у меня есть пользователь, ранее подписанныйIn, и я пытаюсь подписатьInIn Silent второй раз через несколько секунд.

Вторая проблема, с которой я сталкиваюсь, заключается в том, чтобы определить, есть ли пользователь, подписавшийся с использованием:

GIDSignIn.sharedInstance().currentUser

который является либо нолем, либо объектом GIDGoogleUser.

Любая помощь в продвижении по этому вопросу была бы высоко оценена.

Спасибо

4b9b3361

Ответ 1

Вот коды ошибок от GIDSignIn.h. Код -4 отправляется signInSilently, если в цепочке ключей нет токенов auth. См. Комментарии.

// A list of potential error codes returned from the Google Identity SDK.
typedef NS_ENUM(NSInteger, GIDSignInErrorCode) {
  // Indicates an unknown error has occured.
  kGIDSignInErrorCodeUnknown = -1,
  // Indicates a problem reading or writing to the application keychain.
  kGIDSignInErrorCodeKeychain = -2,
  // Indicates no appropriate applications are installed on the user device which can handle
  // sign-in. This code will only ever be returned if using webview and switching to browser have
  // both been disabled.
  kGIDSignInErrorCodeNoSignInHandlersInstalled = -3,
  // Indicates there are no auth tokens in the keychain. This error code will be returned by
  // signInSilently if the user has never signed in before with the given scopes, or if they have
  // since signed out.
  kGIDSignInErrorCodeHasNoAuthInKeychain = -4,
  // Indicates the user canceled the sign in request.
  kGIDSignInErrorCodeCanceled = -5,
};

Для SDK Google в целом я нашел, что комментарии в заголовке файла на самом деле выглядят довольно неплохо, обычно более информативны, чем любая опубликованная документация.

Ответ 2

У меня была такая же проблема. Проблема была в методе:

[[GIDSignIn sharedInstance] setScopes:@[@"https://www.googleapis.com/auth/plus.stream.read", @"https://www.googleapis.com/auth/plus.me"]];

вы должны вызвать его раньше:

[[GIDSignIn sharedInstance] hasAuthInKeychain]    

и

[[GIDSignIn sharedInstance] signIn]   

Ответ 3

У меня была такая же проблема, но я, наконец, нашел ответ. Я обнаружил, что GoogleSignIn принимает UserDefault для сохранения предыдущего статуса входа. Проверьте, используете ли вы UserDefault для разработки своего приложения. Если вы это сделаете, убедитесь, что вы не удалите все данные в UserDefault, если хотите сохранить предыдущий статус входа.

В моем случае

public func resetUserDafault() {

   let userDefaults = UserDefaults.standard

   let dict = UserDefaults.standard.dictionaryRepresentation()

   for key in dict.keys {

       //GoogleSignIn take this key to check previous signin status

       if key == "GID_AppHasRunBefore"{

           continue

       }

       userDefaults.removeObject(forKey: key);

  }

  UserDefaults.standard.synchronize()

}

override func viewDidLoad() {

    super.viewDidLoad()

    //After doing it, my application is working properly now.

    if GIDSignIn.sharedInstance().hasAuthInKeychain() == true{

        GIDSignIn.sharedInstance().signInSilently()

    }
    else{

        //not sign in

    }

}

Ответ 4

Игорь Ротару ответил на правильный ответ. Ключ должен быть установлен перед использованием signInSilently. Он будет проверять, был ли пользователь когда-либо подписан раньше, с областями, которые вы ранее установили и выполнили вход.