ios - 获取电子邮件并命名 Facebook SDK v4.4.0 Swift

标签 ios swift xcode cocoa-touch facebook-sdk-4.0

长话短说:如何获取使用 facebook SDK 4.4 登录我的应用的用户的电子邮件和姓名

到目前为止,我已经成功登录,现在我可以从应用程序中的任何位置获取当前访问 token 。

我如何配置我的登录 View Controller 和 facebook 登录按钮:

class LoginViewController: UIViewController, FBSDKLoginButtonDelegate {

    @IBOutlet weak var loginButton: FBSDKLoginButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        if(FBSDKAccessToken.currentAccessToken() == nil)
        {
            print("not logged in")
        }
        else{
            print("logged in already")
        }

        loginButton.readPermissions = ["public_profile","email"]
        loginButton.delegate = self

    }

    //MARK -FB login
    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        //logged in
        if(error == nil)
        {
            print("login complete")
            print(result.grantedPermissions)
        }
        else{
            print(error.localizedDescription)
        }

    }

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
        //logout
        print("logout")
    }

现在在我的主视图上,我可以像这样获取访问 token :

   let accessToken = FBSDKAccessToken.currentAccessToken()
    if(accessToken != nil) //should be != nil
    {
        print(accessToken.tokenString)
    }

我如何从登录的用户那里获取姓名和电子邮件,我看到许多问题和答案都使用较旧的 SDK 或使用 Objective-C。

最佳答案

我在 android 中使用过 fields,所以我想在 iOS 中也尝试一下,而且它有效。

let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: accessToken.tokenString, version: nil, HTTPMethod: "GET")
   req.startWithCompletionHandler({ (connection, result, error : NSError!) -> Void in
       if(error == nil) {
            print("result \(result)")
       } else {
            print("error \(error)")
       }
   }
)

结果将打印:

result {
   email = "email@example.com";
   id = 123456789;
   name = "Your Name";
}

发现这些字段等于User端点,查看this link,里面可以看到所有可以获取到的字段。

Swift 4 及更高版本的更新

let r = FBSDKGraphRequest(graphPath: "me",
                          parameters: ["fields": "email,name"],
                          tokenString: FBSDKAccessToken.current()?.tokenString,
                          version: nil,
                          httpMethod: "GET")

r?.start(completionHandler: { test, result, error in
    if error == nil {
        print(result)
    }
})

使用 FBSDKLoginKit 6.5.0 更新 Swift 5

guard let accessToken = FBSDKLoginKit.AccessToken.current else { return }
let graphRequest = FBSDKLoginKit.GraphRequest(graphPath: "me",
                                              parameters: ["fields": "email, name"],
                                              tokenString: accessToken.tokenString,
                                              version: nil,
                                              httpMethod: .get)
graphRequest.start { (connection, result, error) -> Void in
    if error == nil {
        print("result \(result)")
    }
    else {
        print("error \(error)")
    }
}

关于ios - 获取电子邮件并命名 Facebook SDK v4.4.0 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314124/

相关文章:

iphone - 如何使用核心数据获取每个第 n 个对象

ios - 特定时间的后台获取

ios - 带和不带参数的闭包语法

swift - 除非绑定(bind)到 Xcode,否则推送通知无法完全正常工作

c - 如何使用 Xcode 将参数传递给 c 控制台程序?

ios - UITableViewCell 和无法使用类型为 'init' 的参数列表调用 '(coder: NSCoder)'

ios - 在Objective-c中使用Socket I/O客户端

javascript - 检测地址栏是否在 iOS 中显示

ios - 使用自动布局和约束设置按钮

swift - Swift 中的连续自动对焦观察者