web-dev-qa-db-ja.com

signInSilently()はエラーコードを生成します= -4

GIDSignIn.sharedInstance()。signInSilently()がエラーを返している場合があります。

エラードメイン= com.google.GIDSignInコード= -4「操作を完了できませんでした。(com.google.GIDSignInエラー-4)」

この問題については、google signindocsまたはstackOverflowの下にこのエラーのドキュメントが見つからないようです。

以前にsignedInユーザーがいない場合にサイレントサインインを要求すると、これがエラーになると予想しています。しかし、驚いたことに、以前にサインインしたユーザーがいて、数秒後にもう一度サイレントサインインを試みた場合でも発生します。

私が苦労している2番目の問題は、以下を使用してサインインしているユーザーがいるかどうかを判断することです。

GIDSignIn.sharedInstance().currentUser

これは、nilまたはGIDGoogleUserオブジェクトのいずれかです。

この問題を進展させるための助けをいただければ幸いです。

ありがとう

20
Edward Ashak

GIDSignIn.hのエラーコードは次のとおりです。 -4コードは、キーチェーンに認証トークンがない場合にsignInSilentlyによって送信されます。コメントを参照してください。

// 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's 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,
};

一般的なGoogleSDKの場合、ヘッダーファイルのコメントは実際にはかなり見やすい場所であり、通常、公開されているドキュメントよりも有益であることがわかりました。

10
jhabbott

私も同じ問題を抱えています。問題は方法にありました:

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

あなたは前にそれを呼ぶべきです:

[[GIDSignIn sharedInstance] hasAuthInKeychain]    

そして

[[GIDSignIn sharedInstance] signIn]   
9
Igor Rotaru

ここでも同じ問題がありましたが、ようやく答えが見つかりました。以前のサインインステータスを維持するために、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
Shih Ken

カスタムボタンを使用している場合は、キーチェーンで認証を確認する必要があります。

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

    GIDSignIn.sharedInstance().signInSilently()

}
else{

    GIDSignIn.sharedInstance().signIn()

}
2
Spydy

イゴールロタルは正解でした。重要なのは、signInSilentlyを使用する前にスコープを設定することです。以前に設定してサインインしたスコープを使用して、ユーザーが以前にサインインしたことがあるかどうかを確認します。

2
chourobin

起動のたびにサインインする代わりに現在のGIDGoogleUserを保存する からの私の答えを参照してください

メソッドを実装せずにGIDSignInUIDelegateプロトコルに準拠する必要があります。

signInWillDispatch:error: 
signIn:presentViewController:
signIn:dismissViewController:

エラー-4が修正されます。

0
AvisSiva

インターネットが利用可能かどうかを確認してから、スタッフに相談してください。セカンダリサインインチェックでiPadが接続されていない場合、このエラーが発生しました。

0
Boris Gafurov

IgorとSpydyの両方が私のために働いた

A SwiftバージョンのIgorの投稿

    GIDSignIn.sharedInstance().uiDelegate = self

    GIDSignIn.sharedInstance()?.hasAuthInKeychain()
    GIDSignIn.sharedInstance()?.signIn()

    // Uncomment to automatically sign in the user.
    GIDSignIn.sharedInstance().signInSilently()

またはSpydyから。

    // google sign in setup
    GIDSignIn.sharedInstance().uiDelegate = self
    if GIDSignIn.sharedInstance().hasAuthInKeychain() == true{
        GIDSignIn.sharedInstance().signInSilently()
    }
    else{
        GIDSignIn.sharedInstance().signIn()
    }
0
Eric Stevenson