Facebook iOS SDK 3.1 se bloquea en una llamada posterior a FBSession openWithBehavior

Si llamamos a openWithBehavior después de una llamada a closeAndClearTokenInformation, causa EXC_BAD_ACCESS. Independientemente de si está utilizando el cuadro de dialog incorporado en el iOS nativo o uno de los que cambian rápidamente.

Nuestro código para iniciar session en FB, la primera vez a través de las obras:

if (![FBSession activeSession]) { #ifdef FREE_APP NSString* suffix = @"free"; #else NSString* suffix = @"paid"; #endif FBSession *session = [[[FBSession alloc] initWithAppID:@"111111111111111" permissions:permissions urlSchemeSuffix:suffix tokenCacheStrategy:nil] autorelease]; [FBSession setActiveSession:session]; } else if ([FBSession activeSession].isOpen) [[FBSession activeSession] close]; [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; }]; 

Nuestro código para cerrar session, después de lo cual el código anterior falla después de openWithBehavior:

 [[FBSession activeSession] closeAndClearTokenInformation]; 

Inicialmente estaba usando openActiveSessionWithReadPermissions en lugar de openWithBehavior, como se prescribe en la 3.1 docs, que no falla, pero la aplicación cambiando de la aplicación FB / Safari no funcionó. ¿Tal vez por la necesidad de tener un sufijo? Si sería más fácil corregir el cambio de aplicación y volver a eso, por favor avise.

Gracias.

Cuando corrí en el simulador 5.x, vi un post de error adicional, muy útil, de openWithBehavior, luego lo busqué en la fuente que hace las cosas mucho más claras:

 if (!(self.state == FBSessionStateCreated || self.state == FBSessionStateCreatedTokenLoaded)) { // login may only be called once, and only from one of the two initial states [[NSException exceptionWithName:FBInvalidOperationException reason:@"FBSession: an attempt was made to open an already opened or closed session" userInfo:nil] raise]; } 

He cambiado mi código para crear siempre una session nueva antes de llamar a openWithBehavior y parece feliz.

ACTUALIZACIÓN: aquí está el código actualizado que comtesting una session activa, luego la cierra, antes de crear una session nueva …

  - (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { if ([FBSession activeSession]) [[FBSession activeSession] closeAndClearTokenInformation]; #ifdef FREE_APP NSString* suffix = @"free"; #else NSString* suffix = @"paid"; #endif NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil]; FBSession *session = [[FBSession alloc] initWithAppID:mFacebookID permissions:permissions urlSchemeSuffix:suffix tokenCacheStrategy:nil]; [FBSession setActiveSession:session]; If (allowLoginUI == YES) { NSLog(@"Calling openWithBehavior"); [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; } ]; } else if(session.state == FBSessionStateCreatedTokenLoaded) { NSLog(@"Calling openWith completion handler"); [session openWithCompletionHandler:^(FBSession *_session, FBSessionState status, NSError *error) { [self sessionStateChanged:session state:status error:error];} ]; } [session release]; return true; }