28

我正在开发一个使用 Facebook SDK 登录的 ios 应用程序。我已将 a 设置LogInViewController为 Storyboard 中的初始视图控制器,用户使用 FB 帐户登录。

我有另一个 ViewController,一旦用户登录,它就会正确加载。

在我正在检查的 AppDelegate 文件中currentAccessToken,如果它不为零,我将直接加载第二个 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()
}

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)
    }
}

我不知道它是否相关,但我也收到了警告,MapViewController因为情节提要中没有针对它的 segue:

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

4

4 回答 4

57

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

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

您可以在调用上述线路后随时检查访问令牌。

编辑:解释

上面这行代码让 Facebook SDK 处理 launchOptions 并提取必要的信息,以识别和持久化应用程序的用户。

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

于 2015-10-06T07:17:56.337 回答
15

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

事实证明,这是因为未启用钥匙串共享(Xcode 8、iOS 10)。要修复,请转到应用程序 -> 功能 -> 钥匙串共享并打开。

完成此操作后,您仍必须完成授权过程并返回应用程序。之后一切都应该好了。

于 2016-10-15T15:16:57.430 回答
0

如果您已经尝试了上述解决方案,但仍有问题,请尝试此方法。

我和我的共同程序员正在使用LoginManager().loginFacebook Swift SDK 中提供的方法。(Xcode8、Swift 3、iOS 10)

导致该问题的一种可能操作是当您成功登录并立即终止应用程序,然后再次打开您的应用程序并AccessToken.current返回nil. 登录后,如果您等待 20 秒或更长时间(我们不确定确切的等待时间,我们等了 7-20 秒)并杀死应用程序,问题似乎就解决了。

我们不确定为什么会发生这种情况,但这解决了我们的问题,我们的猜测是可能存在网络延迟或错误。

于 2017-01-24T16:53:45.763 回答
0

对于那些即使在FBSDKApplicationDelegate.sharedInstance()appdelegate 上设置了仍然有问题的人,如果你在你的 Xcode 控制台上遇到像这样的错误

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

这是模拟器错误,我尝试使用真实设备并且它可以工作,访问令牌不再为零..所以也许在@Kal答案上回答@victor关于这个的评论..

于 2017-04-27T07:37:43.730 回答