facebook ios sdk 3.1.1 FBSession completionHandler no eliminado

Cuando abro la session de Facebook todo va bien y se llama al bloque de finalización.

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { NSLog(@"openSession handler"); }]; 

Pero más tarde, cuando pido permissions adicionales, por ejemplo, a ambos bloques de finalización se les llama no solo el nuevo.

  [FBSession.activeSession reauthorizeWithReadPermissions: [NSArray arrayWithObject:@"user_photos"] completionHandler:^(FBSession *session, NSError *error) { NSLog(@"reauthorize handler"); }]; 

¿Esto es un error o se supone que es así? ¿Cómo puedo evitar este comportamiento? ¿Es posible eliminar el bloque de finalización después de la llamada?

Miré en la muestra Scrumptious y el comportamiento es exactamente el mismo. Cuando la aplicación solicita permissions de publicación, se llama al bloque de finalización de publicación y se vuelve a llamar al bloque de inicio de session.

Estoy probando en iOS5 y Facebook-ios-sdk 3.1.1

Por lo que pude recostackr de la documentation de Facebook en la API, este es un comportamiento previsto (no es un buen layout en mi humilde opinión, pero esa es otra historia).

Fragmento en la descripción del parámetro completionHandler:

"… el object FBSession llamará al bloque cada vez que la session cambie de estado"

No puedo ofrecerte una solución, pero puedo ofrecerte una solución:

 // <Your description of why the workaround is needed. // // REF: http://stackoverflow.com/questions/12751635/facebook-ios-sdk-3-1-1-fbsession-completionhandler-not-removed // __block BOOL workaroundOneTimeRunFlag = NO; [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { if (!workaroundOneTimeRunFlag) { workaroundOneTimeRunFlag = YES; // Your handler was executed for the first time // Run some code... } }]; 

Esto no es un error, y ambos manejadores son llamados intencionalmente por el SDK. Como se indica en los documentos , se llama al controller de openActiveSession cada vez que se produce un cambio en el estado de la session. Pedir permissions adicionales cambiará el estado a FBSessionStateTokenExtended; por lo tanto, se llama al primer controller y luego al controller explícito que proporciona en la reautorización conReadPermissions: