Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

signInSilently() generates an error code=-4

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

like image 662
Edward Ashak Avatar asked Jul 16 '15 17:07

Edward Ashak


3 Answers

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.

like image 148
jhabbott Avatar answered Nov 06 '22 07:11

jhabbott


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]   
like image 9
Igor Rotaru Avatar answered Nov 06 '22 07:11

Igor Rotaru


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

    }

}
like image 4
Shih Ken Avatar answered Nov 06 '22 08:11

Shih Ken