ios9: FBSDK currentAccessToken nil

Posted

技术标签:

【中文标题】ios9: FBSDK currentAccessToken nil【英文标题】: 【发布时间】:2016-08-28 06:58:35 【问题描述】:

FBSDKAccessToken currentAccessToken nil after quitting app

我查看了许多相关线程,我的案例中的解决方案仍然难以辨认。

这是我的 AppDelegate.swift 文件:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

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

  if let accessToken = FBSDKAccessToken.currentAccessToken()
    print(accessToken)
  else
    print("Not logged In.")
  

  return true


   func application(application: UIApplication,
               openURL url: NSURL, options: [String: AnyObject]) -> Bool 


return GIDSignIn.sharedInstance().handleURL(url,
                                            sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
                                            annotation: options[UIApplicationOpenURLOptionsAnnotationKey])





func application(application: UIApplication, openURL url:NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool 
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url,sourceApplication: sourceApplication, annotation: annotation)
 

所以在应用启动时,accessToken 就是nil

当我尝试刷新访问令牌时,它不会这样做,因为您无法引用零用户访问令牌。我想也许它缓存了一个过期的用户令牌。这仍然很奇怪,因为我正在调用应该返回当前用户令牌的 FBSDK,即使它已过期。在我的情况下,它返回nil

这是我尝试使用 currentAccessToken 的方法

func fetchFBInfoForLogin()
let parameters = ["fields": "email, first_name, last_name"]

if (FBSDKAccessToken.currentAccessToken() != nil) 
  print("current access token is not nil")
  // User is logged in, do work such as go to next view controller.
  let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphpath:  "me", parameters: nil)
  graphRequest.startWithCompletionHandler( (connection, result, error) -> Void in

    if ((error) != nil)
    
      // Process error
      print("Error: \(error)")
    
    else
    
      print(result.valueForKey("id") as? String)
      print(result.valueForKey("name") as? String)
      print(result.valueForKey("email") as? String)

    
  )

 else 

  //refresh

  FBSDKAccessToken.refreshCurrentAccessToken (connection, result, error) -> Void in
    if error != nil 
      print(error)
      return
    
    print(FBSDKAccessToken.currentAccessToken())
    print("refresh doesn't work?")
    let parameters = ["fields": "email, first_name, last_name"]
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath:  "me", parameters: parameters)
    graphRequest.startWithCompletionHandler( (connection, result, error) -> Void in

      if ((error) != nil)
      
        // Process error
        print("Error: \(error)")
      
      else
      
        print(result.valueForKey("id") as? String)
        print(result.valueForKey("name") as? String)
        print(result.valueForKey("email") as? String)

      
    )

     


供日后参考: 我没有将我的 FBSDK 委托调用放在正确的 AppDelegate 方法中,就像这个 SO 帖子:Facebook SDK login never calls back my application on ios 9

因此我必须手动关闭我的 FB 登录,这导致回调结果为 result.isCancelled,因此我没有获得任何用户令牌。

【问题讨论】:

【参考方案1】:

如果您想要来自登录和注销事件的通知,请实现FBSDKLoginButtonDelegate 协议。

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FBSDKLoginButtonDelegate 

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 
        if ((error) != nil) 
            // Process error
         else if result.isCancelled 
            // Handle cancellations
         else 
            let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id, email, name"])
            graphRequest.startWithCompletionHandler( (connection, result, error) -> Void in
                if ((error) != nil) 
                    //print("Error: \(error)")
                 else 
                    if let user : NSString = result!.valueForKey("name") as? NSString 
                        print("user: \(user)")
                    
                    if let id : NSString = result!.valueForKey("id") as? NSString 
                        print("id: \(id)")
                    
                    if let email : NSString = result!.value(forKey: "email") as? NSString 
                        print("email: \(email)")
                    
                
            )
        
    

HTH。

【讨论】:

我没有处理 result.isCancelled 案例,这是 FBSDK 委托方法处理程序返回的内容。这是什么意思? 我不确定是否诚实。 :-) 我不记得代码是从哪里来的,可能是修改为 swift 2。通常是错误或 OK,通常是 OK。

以上是关于ios9: FBSDK currentAccessToken nil的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 和 10 (FB SDK 4.2.0) 上的 FBSDKAppInviteDialog 停止在“showFromViewController”上加载

如何在 iOS 9 fb sdk 4.8 或更高版本中从 facebook 获取好友列表?

缩小了最后一个 FB iOS SDK 的 iOS 9 上的 Facebook 应用邀请

Xcode 10 FBSDK 'SDKLoggingBehavior

架构 arm64 的未定义符号:FBSDK View Hierarchy 引用自:FBSDK Marketing Kit

在 XCode 7.0.1 中将 FB SDK(版本 4.7.0)与 iOS 9 集成时出错:canOpenURL:URL 失败:“fbauth2:/”