Sto sviluppando un'applicazione ios utilizzando l'SDK di Facebook per accedere. Ho impostato un LogInViewController
come controller di visualizzazione iniziale nello storyboard, da cui l'utente accede utilizzando l'account FB.FBSDKAccessToken currentAccessToken nil dopo aver smesso di app
ho un altro ViewController che viene caricato correttamente una volta che l'utente accede a.
Nel file AppDelegate sto controllando per currentAccessToken
e se non è pari a zero, sto caricando direttamente il secondo ViewController, perché l'utente è già registrato.
Tuttavia, lo currentAccessToken
è sempre nullo se chiudo l'app e la riavvio. Funziona solo se premo il pulsante Home e riapri l'app mentre è ancora in esecuzione in background.
Ecco i dettagli nel codice:
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)
}
}
Non so se si riferisce, ma ricevo anche un avviso per lo MapViewController
perché non vi è alcun passaggio ERSO dalla Storyboard:
Attenzione: tentativo di presentare MapViewController la cui vista non è nella gerarchia finestra!
FBAccessToken.currentAccessToken richiede un po 'di tempo per essere popolato. Dovresti aspettare che sia disponibile usando sessionStateChangedNotification (come hai già fatto). – ZeMoon
Grazie per la risposta. Quanto tempo ha bisogno? Ciò significa che se l'utente chiude l'app abbastanza velocemente, dovrà effettuare nuovamente l'accesso? Ricordo nelle precedenti versioni di FBSDK, c'era un controllo per il token di accesso memorizzato nella cache, che ora non so come farlo. –
Ho provato a mettere le sessioniStateChangedNotification in viewDidAppear di LoginViewController ma nulla è cambiato. –