FBSDKAccessToken currentAccessToken nil después de cerrar la aplicación

Estoy desarrollando una aplicación ios usando el SDK de Facebook para iniciar session. He configurado un LogInViewController como el controller de vista inicial en el Storyboard, desde donde el usuario inicia session usando la count FB.

Tengo otro ViewController que se carga correctamente una vez que el usuario inicia session.

En el file AppDelegate, estoy buscando currentAccessToken y si no es nil, estoy cargando directamente el segundo ViewController, porque el usuario ya está conectado.

Sin embargo, currentAccessToken siempre es nil si salgo de la aplicación y la currentAccessToken . Solo funciona si presiono el button de inicio y vuelvo a abrir la aplicación mientras todavía se está ejecutando en segundo plano.

Estos son los detalles en el código:

AppDelegate.swift

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.customNavigationBar() if (!isIcloudAvailable()) { self.displayAlertWithTitle("iCloud", message: "iCloud is not available." + " Please sign into your iCloud account and restart this app") return true } if (FBSDKAccessToken.currentAccessToken() != nil) { self.instantiateViewController("MapViewController", storyboardIdentifier: "Main") } return FBSDKApplicationDelegate.shanetworkingInstance().application(application, didFinishLaunchingWithOptions: launchOptions) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.shanetworkingInstance().application( application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } func applicationWillResignActive(application: UIApplication) { FBSDKAppEvents.activateApp() } func applicationDidBecomeActive(application: UIApplication) { FBSDKAppEvents.activateApp() } 

LogInViewController.swift

 override func viewDidLoad() { super.viewDidLoad() // Listen to the Facebook notification and when received, execute func handleFBSessionStateChangeWithNotification NSNotificationCenter.defaultCenter().addObserver(self, selector:"handleFBSessionStateChangeWithNotification:", name: "SessionStateChangeNotification", object: nil) } func handleFBSessionStateChangeWithNotification(notification: NSNotification) { // Switch to MapViewController when logged in if ((FBSDKAccessToken.currentAccessToken()) != nil) { let storyboard = UIStoryboard(name: "Main", bundle: nil) let mapViewController = storyboard.instantiateViewControllerWithIdentifier("MapViewController") as! MapViewController self.presentViewController(mapViewController, animated: false, completion: nil) } } 

No sé si está relacionado, pero también estoy recibiendo una advertencia para el MapViewController porque no hay ninguna orientación hacia él desde el Storyboard:

Advertencia: ¡Intente presentar MapViewController cuya vista no está en la jerarquía de windows!

El problema se debe a que está llamando a FBSDKAccessToken.currentAccessToken() antes de haber llamado

 FBSDKApplicationDelegate.shanetworkingInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 

Puede verificar el token de acceso en cualquier momento después de llamar a la línea anterior.

EDITAR: Explicación

La línea anterior permite que el SDK de Facebook procese las opciones de inicio y extraiga la información necesaria que requerirá para reconocer y mantener al usuario para la aplicación.

En los casos en que el usuario ya está conectado, esto simplemente inicializa el SDK de Facebook, que a su vez inicia session en el usuario sobre la database persistentes.

Pasé un buen medio día golpeando mi cabeza contra este problema. A pesar de asegurarse de que todos los methods delegates estuvieran presentes, el FBSDKAccessToken.current() siempre devolvió nil.

Resulta que esto se debe a que Compartir llavero no está habilitado (Xcode 8, iOS 10). Para solucionarlo, ve a App -> Capacidades -> Compartir llavero y enciéndelo.

Una vez hecho esto, aún debe pasar por el process de autorización y volver a la aplicación. Todo debería estar bien después.

Para aquellos que todavía tienen el problema, incluso después de configurar FBSDKApplicationDelegate.shanetworkingInstance() en el file de aplicación, aparezca si obtienes un error en tu console Xcode como este

 Falling back to storing access token in NSUserDefaults because of simulator bug 

es un error de simulador e bash usar un dispositivo real y funciona, el token de acceso no es nil nuevamente … así que quizás responda @victor comente sobre este en @Kal responda …

Si ya probó las soluciones, pero aún tiene el problema, intente esto.

Mi co-progtwigdor y yo usamos el método de LoginManager().login proporcionado en Facebook Swift SDK. (Xcode8, Swift 3, iOS 10)

Una acción posible que causó ese problema es cuando inicia session correctamente y la elimina de inmediato, luego abre nuevamente su aplicación y AccessToken.current devuelve nil . Después de iniciar session, si espera 20 segundos o más (no estamos seguros del time de espera exacto, esperamos por 7-20 segundos) y eliminamos la aplicación, el problema pareció resolverse.

No estamos seguros de por qué sucedió esto, pero esto resolvió nuestro problema, y ​​nuestra suposition es que puede haber una demora en la networking o un error.