退出应用程序后,FBSDKAccessToken currentAccessToken为零

And*_*nos 28 ios facebook-login facebook-access-token swift fbsdk

我正在使用Facebook SDK开发一个ios应用程序来登录.我LogInViewController在故事板中设置了一个初始视图控制器,用户使用FB帐户登录.

我有另一个ViewController,一旦用户登录就可以正确加载.

在我正在检查的AppDelegate文件中currentAccessToken,如果它不是nil,我将直接加载第二个ViewController,因为用户已经登录.

但是,currentAccessToken如果我退出应用程序并重新启动它,则总是为零.它只有在我按下主页按钮并重新打开应用程序时它才有效,因为它仍然在后台运行.

以下是代码中的详细信息:

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()
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道它是否相关,但我也收到警告,MapViewController因为故事板中没有任何偏见:

警告:尝试呈现其视图不在窗口层次结构中的MapViewController!

ZeM*_*oon 57

问题是因为你在打电话FBSDKAccessToken.currentAccessToken()之前要求

FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
Run Code Online (Sandbox Code Playgroud)

您可以在调用上述行后随时检查访问令牌.

编辑:解释

上面的行让Facebook SDK处理launchOptions并提取必要的信息,以便识别和保留用户的应用程序.

在用户已经登录的情况下,这只是初始化Facebook SDK,而Facebook SDK又根据持久数据登录用户.

  • 这对我不起作用.登录时,FBSDKAccessToken.currentAccessToken()会提供正确的令牌.杀死应用程序后将是零.你提到的appdelefate方法没有任何区别. (6认同)
  • 大!谢谢 - 你在哪里找到了这个文档? (2认同)

Kal*_*Kal 15

我花了半天的时间来讨论这个问题.尽管确保所有委托方法都存在,但FBSDKAccessToken.current()总是返回nil.

事实证明,这是因为未启用Keychain Sharing(Xcode 8,iOS 10).要修复,请转到App - > Capabilities - > Keychain Sharing并打开.

完成此操作后,您仍必须完成授权过程并返回应用程序.以后一切都应该没问题.