【问题标题】:ios9: FBSDK currentAccessToken nilios9: 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,因此我没有获得任何用户令牌。

【问题讨论】:

    标签: ios swift fbsdk


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 2016-01-02
    • 2015-12-18
    • 2015-12-16
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多