with services reversed_client_id info google gidsignin ios swift google-signin

ios - services - signInSilently() genera un código de error=-4



login google swift 4 (7)

Aquí están los códigos de error de GIDSignIn.h . El código -4 es enviado por signInSilently cuando no hay tokens de autenticación en el llavero. Ver comentarios.

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

En general, para los SDK de Google, he encontrado que los comentarios del archivo de encabezado son, en realidad, un lugar bastante bueno para mirar, generalmente más informativo que cualquier documentación publicada.

Tengo este caso en el que GIDSignIn.sharedInstance (). SignInSilently () está devolviendo un error:

Error del dominio = com.google.GIDSignIn Code = -4 "No se pudo completar la operación (error com.google.GIDSignIn -4)"

Parece que no puedo encontrar ninguna documentación de este error en los documentos de inicio de sesión de Google o stackOverflow.

Espero que esto ocurra un error si solicito un inicio de sesión silencioso para ningún usuario que haya firmado previamente. Pero, para mi sorpresa, incluso ocurre cuando un usuario ha iniciado sesión previamente e intento iniciar sesión en silencio una segunda vez después de unos segundos.

Un segundo problema con el que estoy teniendo dificultades es determinar si un usuario ha iniciado sesión con:

GIDSignIn.sharedInstance().currentUser

que es un objeto nulo o GIDGoogleUser.

Cualquier ayuda para avanzar en este tema sería muy apreciada.

Gracias


Compruebe si Internet está disponible y luego proceda con su personal. Recibí este error cuando el iPad no estaba conectado en las comprobaciones secundarias iniciadas.



He tenido el mismo problema. El problema estaba en el método:

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

deberías llamarlo antes

[[GIDSignIn sharedInstance] hasAuthInKeychain]

y

[[GIDSignIn sharedInstance] signIn]


Igor Rotaru tuvo la respuesta correcta. La clave es tener los ámbitos establecidos antes de usar signInSilently . Verificará si el usuario ha iniciado sesión antes con los ámbitos que previamente estableció e inició sesión.


Si está utilizando un botón personalizado, entonces debe verificar la autenticación en el llavero.

if GIDSignIn.sharedInstance().hasAuthInKeychain() == true{ GIDSignIn.sharedInstance().signInSilently() } else{ GIDSignIn.sharedInstance().signIn() }


Tuve el mismo problema aquí, pero finalmente encontré la respuesta. Encontré GoogleSignIn tomando UserDefault para mantener el estado de inicio de sesión anterior. Compruebe si utiliza UserDefault para desarrollar su aplicación. Si lo hace, asegúrese de no eliminar todos los datos de su UserDefault si desea mantener el estado de inicio de sesión anterior.

En mi caso,

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 } }