with ios objective-c facebook-sdk-4.0

with - ios facebook sdk 4.0 código de error de inicio de sesión 304



login facebook swift 3 (14)

304 indica que nada ha cambiado. Probablemente de alguna manera ya esté autenticado y, por lo tanto, sea nulo con 304 que indica que nada ha cambiado.

Acabo de actualizar Facebook SDK v4.0

y de acuerdo con el tutorial de Uso de IU de inicio de sesión personalizado

-(IBAction)facebookLoginClick:(id)sender { FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) { // Process error } else if (result.isCancelled) { // Handle cancellations } else { // If you ask for multiple permissions at once, you // should check if specific permissions missing if ([result.grantedPermissions containsObject:@"email"]) { // Do work } } }]; }

PERO el resultado es siempre nulo y el código de error es 304, ¿me falta algo?


En realidad, la razón es muy simple, puede intentar seguir el siguiente paso para volver a aparecer este código de error fácilmente.

El " error de inicio de sesión de Facebook " puede tener dos razones:

  1. obtienes la información del usuario de Facebook fail.
  2. obtienes la información del usuario del éxito de Facebook, pero la carga a tu propio servidor falla.

El código en FBSDKLoginManager.m es:

- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult { FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil tokenString:loginResult.token.tokenString HTTPMethod:nil flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; [requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { NSString *actualID = result[@"id"]; if ([currentToken.userID isEqualToString:actualID]) { [FBSDKAccessToken setCurrentAccessToken:loginResult.token]; [self invokeHandler:loginResult error:nil]; } else { NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; [FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey]; NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain code:FBSDKLoginUserMismatchErrorCode userInfo:userInfo]; [self invokeHandler:nil error:resultError]; } }]; }

cuando currentToken.userID no es igual a actualID , se arrojará el FBSDKLoginUserMismatchErrorCode .

Ahora, este problema volverá a aparecer cuando el usuario A falle en el inicio de sesión de Facebook, pero no tiene [FacebookSDKManager logOut] después del error, la aplicación almacenará en caché el AccessToken para el usuario A, y luego el usuario A cambiará la cuenta de Facebook al usuario B, cuando el usuario B inicie sesión en Facebook nuevamente, volverá a aparecer este problema.


Esto me sucedió cuando cambié el ID de aplicación de Facebook (en el archivo Info.plist) cambiando de una aplicación de prueba de Facebook a una aplicación de producción de Facebook. Si su aplicación envía el token de Facebook a un servidor que genera un JWT, por ejemplo, Facebook SDK aún persiste el fbToken ( FBSDKAccessToken.currentAccessToken() ) persistió a menos que se le indique que lo elimine. Eso también puede ocurrir en producción cuando un usuario cierra la sesión de la aplicación, una solicitud de API de cierre de sesión cerrará la sesión del usuario y restablecerá su JWT. Pero incluso antes de enviar la solicitud de API de FBSDKLoginManager de sesión, el cliente deberá indicarle a la instancia de FBSDKLoginManager sesión.

if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID() { loginManager.logOut() }


Para mí en Objective-C siguiente funcionó

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; if ([FBSDKAccessToken currentAccessToken]) { [login logOut]; }

y el problema era que el usuario intentaba iniciar sesión como otro usuario como lo sugirió @Vineeth Joseph


Puede usar el siguiente código para resolver su problema:

[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}


Según los documentos, 304 FBSDKLoginUserMismatchErrorCode "indica un error al solicitar nuevos permisos porque el usuario ha cambiado" .

Tiene sentido en el escenario @ Adrian999 mencionado.


También estuve estancado en este tema por un tiempo. luego creé un objeto para FBSDKLoginManager en el archivo .h y en viewDidLoad del archivo .m, inicialícelo y establezca la propiedad de cierre de sesión.

_fbLogin= [[FBSDKLoginManager alloc]init]; [_fbLogin logOut];

Esto me ayudó y la esperanza también te ayuda a ti. Todo lo mejor.

Gracias


Tuve esto, ocurrió al cambiar los detalles de la aplicación FB en Xcode mientras se ejecutaba una aplicación iOS. Debe eliminar la aplicación del dispositivo y luego volver a publicarla con la nueva configuración de la aplicación FB. Simplemente recompilar no es suficiente para borrar la configuración anterior de FB


Tuve un problema similar.

Después de inicializar FBSDKLoginManager , agregué una línea para eliminar los datos y el token (Facebook):

FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init]; [loginmanager logOut];

Espero que esto ayude.

Por lo tanto, exactamente como el OP pregunta: "¿Me estoy perdiendo algo"?

Sí, el siguiente código de ejemplo estándar que se ve en todas partes es simplemente incorrecto:

-(IBAction)facebookLoginClick:(id)sender { FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; ---- ONE MAGIC LINE OF CODE IS MISSING HERE ---- [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) {...} else if (result.isCancelled) {...} else { // (NB for multiple permissions, check every one) if ([result.grantedPermissions containsObject:@"email"]) { NSLog(@"%@",result.token); } } }]; }

tienes que hacer esto:

-(IBAction)facebookLoginClick:(id)sender { FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; [login logOut]; //ESSENTIAL LINE OF CODE [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) {...} else if (result.isCancelled) {...} else { // (NB for multiple permissions, check every one) if ([result.grantedPermissions containsObject:@"email"]) { NSLog(@"%@",result.token); } } }]; }

De lo contrario, de manera muy simple, la aplicación no funcionará si el usuario cambia las cuentas de FB en el dispositivo. (¡A menos que por alguna razón vuelvan a instalar la aplicación!)

Una vez más, el popular código de muestra anterior simplemente no funciona (la aplicación entra en un bucle sin fin) si un usuario cambia las cuentas FB. La llamada logOut debe hacerse.




Swift 3.0

func loginWithFacebook { let loginManager = FBSDKLoginManager() if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID() { loginManager.logOut() } loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in if error != nil { print("error/(String(describing: error))") } else if (result?.isCancelled)! { } else { print(FBSDKAccessToken.current()) } }) }


Swift 4.0 y FBSDKCoreKit 4.33

let loginManager = LoginManager() if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId { loginManager.logOut() }


rápido 4.0, 4.2, 5.0

FBSDKLoginManager().logOut()