Solicitud de FBSessionNewPublishPermissions falla antes de la respuesta

Estoy tratando de get permissions de publicación de un usuario que usa el SDK de Facebook en iOS.

Estoy llamando al siguiente código en un método que se llama si la aplicación no tiene los permissions de publicación necesarios para publicar en la panetworking de facebook de los usuarios.

// No permissions found in session, ask for it [FBSession.activeSession requestNewPublishPermissions: [NSArray arrayWithObject:@"publish_actions"] defaultAudience: FBSessionDefaultAudienceEveryone completionHandler: ^(FBSession *session, NSError *error) { if( !error ) { // Do something } }]; 

La primera vez que invoco este código lleva al usuario a la página de permissions, y antes de que incluso cambie a safari en el dispositivo, se llama al bloque y se devuelve este post de error

 Error Domain=com.facebook.sdk Code=2 "The operation couldn't be completed. (com.facebook.sdk error 2.)" UserInfo=0xc426410 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorReauthorizeFailedReasonUserCancelled, 

La aplicación luego continúa para mostrar la página de permissions en Safari donde el usuario selecciona Aceptar. Luego regresa a la aplicación. Los permissions no se han establecido en este momento, incluso si se ha presentado el usuario con la página de permissions y se ha aceptado.

Al intentar publicar una segunda vez, lleva al usuario a la página de permissions en safari y el método requestNewPublishPermissions no falla al instante. El usuario selecciona ok y luego todo funciona como se esperaba.

Por lo tanto, es solo en la primera vez que llama a requestNewPublishPermissions que falla al devolver instantáneamente el error ErrorReauthorizeFailedReasonUserCancelled.

Esto sucede en el simulador y en el dispositivo.

¿Alguna idea de lo que podría estar causando esto?

Encontré la solución a este problema en la respuesta a esta pregunta Facebook iOS 3.1 inicio de session SDK con devolución de permissions de publicación

  dispatch_async(dispatch_get_current_queue(), ^{ [self openSessionForPublishPermissions]; }); 

Donde opensessionforpublishpermissions es el método que contiene el método requestNewPublishPermissions.

"La razón es que la llamada para volver a autorizar … debe ser posterior al bucle de evento del cual se llama openActiveSession ..".

Supongo que este es un error en el SDK de Facebook, no tiene sentido que esto sea un comportamiento normal y no he visto ninguno de los comentarios de Facebook sobre este comportamiento esperado.

Tuve el problema similar, y la respuesta, proporcionada por Tiddly, funcionó para mí. Durante algún time.

Más tarde encontré el mismo problema. No sé por qué, puede ser que estuviera preocupado por las actualizaciones de SDK o iOS, se puede ejecutar el ciclo de la aplicación se hizo más complicado. Entonces inspeccioné el origen del SDK de FB y descubrí que este problema ocurre cuando pides permissions de publicación justo después de los permissions de lectura , así:

 // Open with read permissions [FBSession openActiveSessionWithReadPermissions: readPermissions allowLoginUI: YES completionHandler: ^ (FBSession *session, FBSessionState status, NSError *error) { // Ask for publish permissions (This is incorrect!) [FBSession.activeSession requestNewPublishPermissions:publishPermissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler: ^(FBSession *session, NSError *error) { // ... }]; }]; 

Cuando su aplicación cambia a Safari o FacebookApp y viceversa, -application: openURL: sourceApplication: annotation: se llama. CompletionHandler de +openActiveSessionWithReadPermissions: llamado inmediatamente después de esto, antes de applicationDidBecomeActive: Y después de comenzar la reautorización applicationDidBecomeActive: finalmente se llama. Entonces, FB SDK piensa que el usuario ha vuelto a la aplicación, sin otorgar permissions y la reautorización falla con ese "com.facebook.sdk error 2." error.

A veces dispatch_async() funciona bien. Pero la solución robusta es esperar a que la session activa maneje el evento App Did Become Active. Y luego solicite permissions de publicación adicionales. Aquí hay un ejemplo de cómo lograr esto:

 - (void)applicationDidBecomeActive:(UIApplication *)application { [FBAppCall handleDidBecomeActive]; if (self.shouldReauthorise) { [self requestPublishPermissions]; self.shouldReauthorise = NO; } }