Ich entwickle eine iOS-App mit dem Facebook SDK zum Anmelden. Ich habe eine LogInViewController
als anfängliche View Controller im Storyboard eingestellt, von wo aus der Benutzer sich mit dem FB-Account anmeldet.FBSDKAccessToken currentAccessToken nil nach Beenden der App
ich einen anderen Viewcontroller haben, die korrekt, sobald die Benutzer anmeldet geladen wird.
In der AppDelegate Datei, die ich für currentAccessToken
bin Überprüfung und wenn es nicht gleich Null ist, ich bin Laden direkt den zweiten Viewcontroller, weil der Benutzer bereits angemeldet.
Allerdings ist die currentAccessToken
immer Null, wenn ich die App beende und neu starte. Es funktioniert nur, wenn ich die Home-Taste drücke und die App wieder öffne, während sie noch im Hintergrund läuft.
Hier sind die Details im Code:
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)
}
}
Ich weiß nicht, ob es sich bezieht, aber ich bekomme auch eine Warnung für die MapViewController
, weil es keine Überfahrt gibt owards es aus dem Storyboard:
Warnung: Versuch MapViewController deren Ansicht zu präsentieren ist nicht in der Fenster Hierarchie!
FBAccessToken.currentAccessToken dauert einige Zeit, um ausgefüllt werden. Sie sollten darauf warten, dass es mit der sessionStateChangedNotification verfügbar ist (wie Sie es bereits getan haben). – ZeMoon
Vielen Dank für Ihre Antwort. Wie viel Zeit braucht es? Das heißt, wenn der Benutzer die App schnell beendet, muss er sich erneut anmelden. Ich erinnere mich an frühere FBSDK-Versionen, es gab eine Überprüfung für zwischengespeicherte Zugriffstoken, die ich jetzt nicht weiß, wie das geht. –
Ich habe versucht, die SessionsChangedNotification in ViewDidAppear des LoginViewController zu setzen, aber nichts geändert. –