FBSession.openActiveSessionWithReadPermissions no está llamando a completionHandler

Estoy implementando el inicio de session de OAuth utilizando el SDK de Facebook, pero el método FBSession.openActiveSessionWithReadPermissions: allowLoginUI: completionHandler no está llamando a completionHandler ni devuelve "true", lo que indicaría un token almacenado en caching. Todo lo demás parece funcionar bien, excepto esto. ¿Qué ocurre con este código?

var completionHandler: FBSessionStateHandler = { session, status, error in NSLog("token not cached"); if error { // Login failed for some reason, so we notify the delegate. self.delegate.didFailOpenningSession?(self, withError: ErrorUtility.error( code: .FailedOpenningSession, withFacebookError: error )); // Don't proceed on errors return; } // Session is now open, we should notify the delegate self.delegate.didOpenSession?(self); }; NSLog("here"); // Open the session, prompting the user if necessary. This might send the application to the background if FBSession.openActiveSessionWithReadPermissions(["public_profile"], allowLoginUI: true, completionHandler: completionHandler) { NSLog("Token cached"); // If we end up here, the session token must exist, so we now have an open session self.delegate.didOpenSession?(self); } 

Edit: Me olvidé de mencionar que el NSLog registra "aquí", pero no "Token cached" ni "token no cacheado"

Editar: ahora las cosas se volvieron un poco extrañas. Cuando se inicia mi aplicación, muestro una pantalla con un button de inicio de session en Facebook. Cuando el usuario presiona el button, se activa el código anterior. Después de autorizar la aplicación, la aplicación vuelve a la misma pantalla (no debería, pero no puedo hacerlo de otra manera hasta que se llame al manejador de finalización). Luego intenté presionar el button nuevamente y ahora obtengo los loggings.

Esto es lo que obtengo:

  here token not cached here 

La primera línea es desde el primer button presionar, los otros dos aparecen cuando presiono la segunda vez. Ahora, ¿qué tiene de extraño? ¿No debería invertirse "token not cached" y "here"? ¿Está llamando al competionHandler de la última llamada o algo así?

No importa, mucho se arregla.

Editar: otra cosa. Si presiono el button varias veces, siempre obtengo "token no cacheado". Creo que debería estar almacenando en caching

Esta resuelto Me estaba perdiendo el método AppDelegate.application: handleOpenURL -> Bool

Primero asegúrese de que está utilizando la syntax correcta de cierre. No está proporcionando una callback de cierre coincidente para la callback en bloque.

note que la callback de bloque para la session de FB es:

 ^(FBSession *session, FBSessionState state, NSError *error) 

Deberías

  /*function parameters*/){ session, state, error in //closure declaration goes at the top after the { //Insert logic here NSLog("Token cached"); } 

Esto equivaldrá a

 FBSession.openActiveSessionWithReadPermissions(permissions, allowLoginUI:true){ session, state, error in //callback code body here } 

Esto generalmente debido a la falta de control de manejo en la aplicación de la aplicación: function openURL. Está en AppDelegate.m. La descripción de las muestras de Facebook dice lo siguiente:

  // During the Facebook login flow, your app passes control to the Facebook iOS app or Facebook in a mobile browser. // After authentication, your app will be called back with the session information. // Override application:openURL:sourceApplication:annotation to call the FBsession object that handles the incoming URL - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [FBSession.activeSession handleOpenURL:url]; }