FBSDKAccessToken currentAccessToken nil nach dem beenden der app
Ich bin der Entwicklung einer ios-app mit der Facebook SDK anmelden.
Ich habe eine LogInViewController
als initial View Controller im Storyboard, von wo aus der Benutzer-logins mit dem FB-Konto.
Habe ich einen anderen ViewController geladen wird, ist korrekt, wenn der Benutzer sich anmeldet.
In der AppDelegate-Datei checke ich für currentAccessToken
und wenn es nicht nil ist, ich bin laden direkt den zweiten ViewController, da der Benutzer bereits angemeldet ist.
Jedoch die currentAccessToken
ist immer null, wenn ich die app beenden und neu starten. Es funktioniert nur, wenn ich drücken Sie die home-Taste und re-öffnen Sie die app, während es 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 zusammenhängt, aber ich bin auch immer eine Warnung für die MapViewController
denn es ist kein übergang zum es aus dem Storyboard:
Warnung: Versuch MapViewController dessen Blick ist nicht in die
Fenster-Hierarchie!
- FBAccessToken.currentAccessToken dauert einige Zeit aufgefüllt werden. Sie sollten warten, bis es verfügbar sessionStateChangedNotification (wie du schon getan haben).
- Danke für deine Antwort. Wie viel Zeit braucht es? Das bedeutet, dass, wenn der Benutzer beendet die app Recht schnell, wird er erneut anmelden zu müssen? Ich erinnere mich, in früheren FBSDK Versionen gab es einen Scheck für den Cache access-token, welches jetzt weiß ich nicht, wie das zu tun.
- Ich habe versucht, die sessionsStateChangedNotification in viewDidAppear der LoginViewController aber nichts geändert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, weil Sie anrufen, um
FBSDKAccessToken.currentAccessToken()
vorher genanntKönnen Sie prüfen, ob das access-token jederzeit nach dem Aufruf der oben genannten Zeile.
EDIT: Erklärung
Die Zeile oben können Sie die Facebook-SDK Prozess der launchOptions und extrahieren Sie die notwendigen Informationen, die Sie benötigen, um zu erkennen und bleiben bestehen, die der Benutzer für die Anwendung.
In Fällen, in denen der Benutzer bereits angemeldet ist, diese einfach initialisiert die Facebook-SDK, was wiederum die Protokolle in der Benutzer auf der Grundlage von gespeicherten Daten.
didFinishLaunchingWithOptions
App Delegate-Methode, wie Sie ist.-[application:didFinishLaunchingWithOptions:]
, und Sie passieren zuFBSDKApplicationDelegate
den gleichen Parametern, die Sie erhalten (application
undlaunchOptions
)Ich verbrachte eine schöne halbe Tag schlug meinen Kopf gegen dieses Problem. Trotz, dass alle die delegate-Methoden vorhanden waren, die
FBSDKAccessToken.current()
immer wieder bei null.Es stellt sich heraus, dass dies, weil Schlüsselbund Teilen ist nicht aktiviert ( Xcode 8, iOS 10). Zu beheben, gehen Sie zu App -> Funktionen> Schlüsselanhänger Sharing und einschalten.
Sobald dies geschehen ist, haben Sie noch gehen mit der Autorisierungs-Prozess und kehren Sie zurück zu der app. Sollte alles in Ordnung sein nach.
Für diejenigen, die immer noch das problem auch nach der
FBSDKApplicationDelegate.sharedInstance()
auf die appdelegate, ergeben sich, wenn u get Fehler auf Ihrem Xcode-Konsole wie diesees ist simulator bug und ich versuche mit realen Gerät, und es funktioniert, die access-token ist nicht nil ist, wieder..
also, vielleicht beantworten Sie @victor Kommentar über diese eine, auf @Kal Antwort..
Wenn Sie schon versucht nach Lösungen, aber immer noch das problem haben, versuchen Sie dies.
Mein co-Programmierer und ich sind mit der
LoginManager().login
Methode in Facebook Swift SDK. (Xcode8, Swift 3, iOS 10)Eine mögliche Aktion, die verursacht, dass Problem ist, wenn Sie die Anmeldung erfolgreich und töten die app sofort, dann öffnen Sie die app erneut, und die
AccessToken.current
zurücknil
. Nach dem login, wenn Sie warten, 20 Sekunden oder länger, (wir sind nicht sicher, die genaue Wartezeit, warteten wir 7-20 Sekunden) und killt die app, das problem schien gelöst zu sein.Wir sind nicht sicher, warum dies passiert, aber das löste unser problem und unsere Vermutung ist, dass es möglicherweise eine Verzögerung Netzwerk oder ist das ein bug.