GIDSignIn.sharedInstance()。signInSilently()がエラーを返している場合があります。
エラードメイン= com.google.GIDSignInコード= -4「操作を完了できませんでした。(com.google.GIDSignInエラー-4)」
この問題については、google signindocsまたはstackOverflowの下にこのエラーのドキュメントが見つからないようです。
以前にsignedInユーザーがいない場合にサイレントサインインを要求すると、これがエラーになると予想しています。しかし、驚いたことに、以前にサインインしたユーザーがいて、数秒後にもう一度サイレントサインインを試みた場合でも発生します。
私が苦労している2番目の問題は、以下を使用してサインインしているユーザーがいるかどうかを判断することです。
GIDSignIn.sharedInstance().currentUser
これは、nilまたはGIDGoogleUserオブジェクトのいずれかです。
この問題を進展させるための助けをいただければ幸いです。
ありがとう
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の場合、ヘッダーファイルのコメントは実際にはかなり見やすい場所であり、通常、公開されているドキュメントよりも有益であることがわかりました。
私も同じ問題を抱えています。問題は方法にありました:
[[GIDSignIn sharedInstance] setScopes:@[@"https://www.googleapis.com/auth/plus.stream.read", @"https://www.googleapis.com/auth/plus.me"]];
あなたは前にそれを呼ぶべきです:
[[GIDSignIn sharedInstance] hasAuthInKeychain]
そして
[[GIDSignIn sharedInstance] signIn]
ここでも同じ問題がありましたが、ようやく答えが見つかりました。以前のサインインステータスを維持するために、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
}
}
カスタムボタンを使用している場合は、キーチェーンで認証を確認する必要があります。
if GIDSignIn.sharedInstance().hasAuthInKeychain() == true{
GIDSignIn.sharedInstance().signInSilently()
}
else{
GIDSignIn.sharedInstance().signIn()
}
イゴールロタルは正解でした。重要なのは、signInSilently
を使用する前にスコープを設定することです。以前に設定してサインインしたスコープを使用して、ユーザーが以前にサインインしたことがあるかどうかを確認します。
起動のたびにサインインする代わりに現在のGIDGoogleUserを保存する からの私の答えを参照してください
メソッドを実装せずにGIDSignInUIDelegateプロトコルに準拠する必要があります。
signInWillDispatch:error:
signIn:presentViewController:
signIn:dismissViewController:
エラー-4が修正されます。
インターネットが利用可能かどうかを確認してから、スタッフに相談してください。セカンダリサインインチェックでiPadが接続されていない場合、このエラーが発生しました。
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()
}