ios swift facebook-login facebook-access-token fbsdk

ios - FBSDKAccessToken currentAccessToken nil después de salir de la aplicación



share facebook swift (4)

Estoy desarrollando una aplicación ios utilizando el SDK de Facebook para iniciar sesión. He establecido un LogInViewController como el controlador de vista inicial en el Storyboard, desde donde el usuario inicia sesión con la cuenta de FB.

Tengo otro ViewController que se carga correctamente una vez que el usuario inicia sesión.

En el archivo AppDelegate estoy revisando currentAccessToken y si no es nulo, estoy cargando directamente el segundo ViewController, porque el usuario ya ha iniciado sesión.

Sin embargo, currentAccessToken siempre es nulo si salgo de la aplicación y la currentAccessToken . Solo funciona si presiono el botón de inicio y vuelvo a abrir la aplicación mientras aún se ejecuta en segundo plano.

Aquí están 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.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.sharedInstance().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 recibo una advertencia para el MapViewController porque no hay ningún indicio en el Storyboard:

Advertencia: ¡Intente presentar MapViewController cuya vista no se encuentra en la jerarquía de ventanas!


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

FBSDKApplicationDelegate.sharedInstance().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 conservar al usuario para la aplicación.

En los casos en los que el usuario ya ha iniciado sesión, esto simplemente inicializa el SDK de Facebook, que a su vez registra al usuario sobre la base de datos persistentes.


Para aquellos que aún tienen el problema, incluso después de configurar el FBSDKApplicationDelegate.sharedInstance() en el appdelegate, resulta si obtienes un error en tu consola Xcode como este

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

es un error del simulador y trato de usar un dispositivo real y funciona, el token de acceso no es nulo otra vez ... así que tal vez responda el comentario de @victor sobre este en @Kal answer ...


Pasé medio día golpeando mi cabeza contra este problema. A pesar de asegurarse de que todos los métodos de delegado estuvieran presentes, el FBSDKAccessToken.current() siempre devolvió el valor nulo.

Resulta que esto se debe a que Keychain Sharing no está habilitado (Xcode 8, iOS 10). Para solucionarlo, vaya a Aplicación -> Capacidades -> Compartir llavero y enciéndalo.

Una vez hecho esto, todavía tiene que pasar por el proceso de autorización y volver a la aplicación. Todo debería estar bien después.


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

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

Una posible acción que causó ese problema es cuando AccessToken.current sesión correctamente y eliminas la aplicación inmediatamente, luego abres la aplicación nuevamente y AccessToken.current devuelve nil . Después de iniciar sesión, si espera 20 segundos o más (no estamos seguros del tiempo de espera exacto, esperamos 7-20 segundos) y cancela la aplicación, el problema parece haberse resuelto.

No estamos seguros de por qué sucedió esto, pero esto resolvió nuestro problema y creemos que puede haber un retraso en la red o un error.