web-dev-qa-db-fra.com

FBSDKAccessToken currentAccessToken nil après avoir quitté l'application

Je développe une application ios à l'aide du SDK Facebook pour me connecter. J'ai défini un LogInViewController comme contrôleur de vue initial dans le Storyboard, d'où l'utilisateur se connecte à l'aide du compte FB.

J'ai un autre ViewController qui est chargé correctement une fois que l'utilisateur se connecte.

Dans le fichier AppDelegate, je recherche currentAccessToken et s'il n'est pas nul, je charge directement le deuxième ViewController, car l'utilisateur est déjà connecté.

Cependant, le currentAccessToken est toujours nul si je quitte l'application et la relance. Cela ne fonctionne que si j'appuie sur le bouton d'accueil et que je rouvre l'application pendant qu'elle fonctionne toujours en arrière-plan.

Voici les détails dans le 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)
    }
}

Je ne sais pas si c'est lié, mais je reçois également un avertissement pour le MapViewController car il n'y a pas de séquence de mise en place depuis le Storyboard:

Avertissement: essayez de présenter MapViewController dont la vue n'est pas dans la hiérarchie des fenêtres!

28
Andreas Xenos

Le problème est que vous appelez FBSDKAccessToken.currentAccessToken() avant d'avoir appelé

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

Vous pouvez vérifier le jeton d'accès à tout moment après avoir appelé la ligne ci-dessus.

MODIFIER: Explication

La ligne ci-dessus permet au SDK Facebook de traiter les options de lancement et d'extraire les informations nécessaires dont il aura besoin pour reconnaître et conserver l'utilisateur pour l'application.

Dans les cas où l'utilisateur est déjà connecté, cela initialise simplement le SDK Facebook qui à son tour connecte l'utilisateur sur la base de données persistantes.

57
ZeMoon

J'ai passé une belle demi-journée à me cogner la tête contre ce problème. En dépit de s'assurer que toutes les méthodes déléguées étaient présentes, la FBSDKAccessToken.current() retournait toujours nil.

Il s'avère que cela est dû au fait que le partage de trousseau n'est pas activé (Xcode 8, iOS 10). Pour résoudre ce problème, accédez à Application -> Capacités -> Partage du troussea et activez.

Une fois cela fait, vous devez toujours passer par le processus d'autorisation et revenir à l'application. Tout devrait bien se passer après.

15
Kal

Pour ceux qui ont toujours le problème même après avoir défini la FBSDKApplicationDelegate.sharedInstance() sur l'appdelegate, il s'avère que si vous obtenez une erreur sur votre console Xcode comme celle-ci

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

c'est un bug de simulateur et j'essaie d'utiliser un appareil réel et cela fonctionne, le jeton d'accès n'est plus nul .. alors peut-être répondre au commentaire de @victor sur celui-ci sur la réponse @Kal ..

0
Abadi

Si vous avez déjà essayé les solutions, mais avez toujours le problème, essayez ceci.

Mon co-programmeur et moi utilisons la méthode LoginManager().login fournie dans Facebook Swift SDK. (Xcode8, Swift 3, iOS 10))

Une action possible qui a provoqué ce problème est lorsque vous vous connectez avec succès et tuez l'application immédiatement, puis ouvrez à nouveau votre application et le AccessToken.current renvoie nil. Après la connexion, si vous attendez 20 secondes ou plus (nous ne sommes pas sûrs du temps d'attente exact, nous avons attendu 7 à 20 secondes) et que vous tuez l'application, le problème semble être résolu.

Nous ne savons pas pourquoi cela s'est produit, mais cela a résolu notre problème, et notre supposition est qu'il peut y avoir un retard de réseau ou un bogue.

0
MnS