La autorización de Facebook falla en iOS6 al cambiar de cuenta de FB en el dispositivo

Estoy usando el Facebook SDK 3.1.1 para implementar FB Connect en mi aplicación de iOS. Esto funciona bien en el caso simple con la nueva integración de FB (iniciada en iOS) o volviendo a la autorización normal a través de la vista web (no tengo la aplicación nativa de Facebook instalada en ambos casos). El problema ocurre cuando cambio la cuenta en el nivel de iOS. Cerrar sesión e iniciar sesión con una cuenta de usuario de FB diferente.

Para iniciar sesión / autorizar, realizo:

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; }]; 

Si luego obtiene un FBSessionStateClosedLoginFailed cada vez que realizo un closeAndClearTokenInformation cuando se alcanza ese estado:

 - (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error { NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]); switch (state) { case FBSessionStateOpen: break; case FBSessionStateClosed: case FBSessionStateClosedLoginFailed: NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]); [[FBSession activeSession] closeAndClearTokenInformation]; break; default: break; } 

Sin embargo, recibo el mismo estado en cada rebash. Mi registro dice lo siguiente:

 FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257 FBSessionStateClosedLoginFailed TOKEN: (null) FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn't be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason} 

¿Alguien puede reproducir esto o tiene alguna idea de dónde podría estar el problema?

Otra respuesta proporciona una forma de resincronizar manualmente el dispositivo con el servidor. fbRsync un método llamado fbRsync para llamar a este código. Asegúrese de #import en su archivo de implementación y luego defina este método:

 -(void)fbResync { ACAccountStore *accountStore; ACAccountType *accountTypeFB; if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){ NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB]; id account; if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){ [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { //we don't actually need to inspect renewResult or error. if (error){ } }]; } 

}

Luego llamo a fbResync si openActiveSessionWithReadPermissions arroja un error:

 [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { if(error) { NSLog(@"Session error"); [self fbResync]; [NSThread sleepForTimeInterval:0.5]; //half a second [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; }]; } else [self sessionStateChanged:session state:state error:error]; }]; 

El retraso de medio segundo es probablemente innecesario, pero actualmente me da tranquilidad.

Esto parece resolver el problema para mí. Ahora puedo cambiar entre cuentas de Facebook y puedo iniciar sesión. ¡Yay!

Yo tuve el mismo problema. Verifique que su aplicación FB esté habilitada en Configuración -> Facebook. El mío estaba deshabilitado (aunque no recuerdo haberlo inhabilitado) y una vez que lo habilité, se solucionó.

En mi proceso de prueba, he agregado y eliminado mi aplicación de FB varias veces desde mi cuenta de FB, que está vinculada a mi iPhone. Puede explicar por qué, mágicamente, mi aplicación estaba deshabilitada.

En ios 6 con fb sdk 3.1.1. Pase el parámetro de permisos como “nulo o correo electrónico” en el método “[FBSessio openActiveSessionWithReadPermissions …”]. Aquí mi código fue excelente.

 #define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 ) -(void)showFBLogin { [FBSession.activeSession closeAndClearTokenInformation]; NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil]; #ifdef IOS_NEWER_OR_EQUAL_TO_6 permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil]; #endif NSLog(@"\npermissions = %@", permissions); [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler: ^(FBSession *session, FBSessionState state, NSError *error) { NSLog(@"\nfb sdk error = %@", error); switch (state) { case FBSessionStateOpen: [[FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection, NSDictionary *user, NSError *error) { if (!error) { //success } }]; break; case FBSessionStateClosed: //need to handle break; case FBSessionStateClosedLoginFailed: //need to handle break; default: break; } }]; } 

Tengo el mismo problema en 3.1.3 FB SDK con iOS7.1. Y encuentro una solución aquí. Espero que ayude !!
He intentado todas las respuestas aquí.
@loganathan permisos nil, @ill_always_be_a_warriors fbResync.
Todos esos no funcionan para mí.

Pero descubrí que funcionará bien cuando ejecute el mismo código en el simulador de iPhone 7.1
(sin SSO “Single Sign On”)

El mismo código funciona bien en la versión anterior iOS FB SDK (no estoy seguro de qué versión, pero no 3.13)
(pero no se mostrará SSO cuando intente iniciar sesión)

Por lo tanto, trato de volver a escribir un problema de muestra. Encontré varios diferentes aquí.
1. https://developers.facebook.com/docs/ios/getting-started Agregar nuevo FacebookDisplayName
2. Modifico mi BundleID para iTune connect pero no lo actualizo de nuevo a Faceboook App Dev

Después de modificar esa configuración, funciona en mi aplicación iOS con la función SSO.
Espero que ayude !!

¿Has probado los métodos RenewSystemCredential? Mira esta publicación:

Facebook iOS SDK extendAccessToken no funciona – fbDidExtendToken no se llama

Tengo el mismo error. Pero utilicé el método @ill_always_be_a_warriors: -(void)fbResync pero no funcionó para mí.

Finalmente encontré que es mi problema de permisos, offline_access permiso offline_access , funciona, espero que ayude a alguien.