I'm having this case where the GIDSignIn.sharedInstance().signInSilently() is returning an error:
Error Domain=com.google.GIDSignIn Code=-4 "The operation couldn’t be completed. (com.google.GIDSignIn error -4.)"
I can't seem to find any documentation of this error under the google signin docs or stackOverflow for that matter.
I'm expecting this to error to happen if I request a silent signIn for no previously signedIn user. But to my surprise it even happens when I have a user previously signedIn and I attempt to signIn Silently a second time after a few seconds.
A second issue I'm having difficulty with is to determine if there is a user signed In using :
GIDSignIn.sharedInstance().currentUser
which is either a nil or a GIDGoogleUser object.
Any help making progress on this issue would be much appreciated.
Thanks
Here are the error codes from GIDSignIn.h
. The -4
code is sent by signInSilently
when there are no auth tokens in the keychain. See comments.
// 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,
};
For the Google SDKs in general I've found the header file comments are actually a pretty good place to look, usually more informative than any published documentation.
I've had the same problem. The problem was in method:
[[GIDSignIn sharedInstance] setScopes:@[@"https://www.googleapis.com/auth/plus.stream.read", @"https://www.googleapis.com/auth/plus.me"]];
you should call it before:
[[GIDSignIn sharedInstance] hasAuthInKeychain]
and
[[GIDSignIn sharedInstance] signIn]
I had the same issue here, but I finally found the answer. I found GoogleSignIn taking UserDefault for keeping previous sign-in status. Please check whether or not you use UserDefault to develop your application. If you do, please make sure you won't delete all of the data in your UserDefault if you want to keep previous sign-in status.
In my case,
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 you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With