FBSDKAccessToken currentAccessToken 退出app后为nil
FBSDKAccessToken currentAccessToken nil after quitting app
我正在开发一个 ios 应用程序,使用 Facebook SDK 进行登录。
我已经在故事板中设置了一个 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()
}
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:
Warning: Attempt to present MapViewController whose view is not in the
window hierarchy!
问题是因为您在调用
之前调用了 FBSDKAccessToken.currentAccessToken()
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
您可以在调用上述行后随时检查访问令牌。
编辑:解释
以上行让 Facebook SDK 处理 launchOptions 并提取识别和保留应用程序用户所需的必要信息。
在用户已经登录的情况下,这只是初始化 Facebook SDK,后者会根据持久数据登录用户。
我花了半天的时间来解决这个问题。尽管确保所有委托方法都存在,FBSDKAccessToken.current()
总是 returned nil。
原来这是因为Keychain Sharing没有启用(Xcode8,iOS10)。要修复,请转至 App -> Capabilities -> Keychain Sharing 并打开。
完成此操作后,您仍必须完成授权过程并 return 返回到应用程序。之后一切都应该没问题。
如果您已经尝试过上述解决方案,但问题仍然存在,请试试这个。
我的 co-programmer 和我正在使用 Facebook Swift SDK 中提供的 LoginManager().login
方法。 (Xcode8, Swift 3, iOS 10)
导致该问题的一个可能操作是当您成功登录并立即终止应用程序,然后再次打开您的应用程序和 AccessToken.current
returns nil
。登录后,如果等待20秒或更长时间(我们不确定确切的等待时间,我们等了7-20秒)并杀死应用程序,问题似乎就解决了。
我们不确定为什么会发生这种情况,但这解决了我们的问题,我们猜测可能存在网络延迟或错误。
对于那些即使在 appdelegate 上设置 FBSDKApplicationDelegate.sharedInstance()
后仍然有问题的人,如果你在你的 Xcode 控制台上遇到像这样的错误
Falling back to storing access token in NSUserDefaults because of simulator bug
这是模拟器错误,我尝试使用真实设备并且它可以工作,访问令牌又不是零了..
所以也许在@Kal answer 上回答@victor 关于这个的评论..
我正在开发一个 ios 应用程序,使用 Facebook SDK 进行登录。
我已经在故事板中设置了一个 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()
}
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:
Warning: Attempt to present MapViewController whose view is not in the window hierarchy!
问题是因为您在调用
之前调用了FBSDKAccessToken.currentAccessToken()
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
您可以在调用上述行后随时检查访问令牌。
编辑:解释
以上行让 Facebook SDK 处理 launchOptions 并提取识别和保留应用程序用户所需的必要信息。
在用户已经登录的情况下,这只是初始化 Facebook SDK,后者会根据持久数据登录用户。
我花了半天的时间来解决这个问题。尽管确保所有委托方法都存在,FBSDKAccessToken.current()
总是 returned nil。
原来这是因为Keychain Sharing没有启用(Xcode8,iOS10)。要修复,请转至 App -> Capabilities -> Keychain Sharing 并打开。
完成此操作后,您仍必须完成授权过程并 return 返回到应用程序。之后一切都应该没问题。
如果您已经尝试过上述解决方案,但问题仍然存在,请试试这个。
我的 co-programmer 和我正在使用 Facebook Swift SDK 中提供的 LoginManager().login
方法。 (Xcode8, Swift 3, iOS 10)
导致该问题的一个可能操作是当您成功登录并立即终止应用程序,然后再次打开您的应用程序和 AccessToken.current
returns nil
。登录后,如果等待20秒或更长时间(我们不确定确切的等待时间,我们等了7-20秒)并杀死应用程序,问题似乎就解决了。
我们不确定为什么会发生这种情况,但这解决了我们的问题,我们猜测可能存在网络延迟或错误。
对于那些即使在 appdelegate 上设置 FBSDKApplicationDelegate.sharedInstance()
后仍然有问题的人,如果你在你的 Xcode 控制台上遇到像这样的错误
Falling back to storing access token in NSUserDefaults because of simulator bug
这是模拟器错误,我尝试使用真实设备并且它可以工作,访问令牌又不是零了.. 所以也许在@Kal answer 上回答@victor 关于这个的评论..