TL;TR:如何获取使用facebook SDK 4.4登录我的应用程序的用户的邮箱和姓名

到目前为止,我已经成功登录,现在我可以从应用程序中的任何地方获得当前的访问令牌.

如何配置登录视图控制器和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")
    }

现在在我的主视图中,我可以获得如下访问令牌:

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

如何从登录的用户那里获取姓名和邮箱,我使用旧的SDK或Objective-C看到了许多问题和答案.

推荐答案

我在安卓系统中使用了fields,所以我想在iOS中也try 一下,而且效果很好.

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

Swift相关问答推荐

如何根据列表中的项目数量创建多个变量?

是否可以将字典项绑定到文本字段?

VisionOS发送通知

减go 用SWIFT struct 填充的NSCountedSet

SWIFT:使字典数组值可变

查找数组中 ** 元素 ** 的属性的最小值和最大值

我可以为UIMenu设定一个固定的订单吗?

background Task(.backgroundTask)不适用于MySQL

在SwiftUI中绘制形状的路径后填充形状

为什么这个快速代码不显示文本字段?

SwiftUI路径平滑连接两条线

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

持久化字符串列表属性 RealmSwift

如何使 SwiftUI Picker 换行文本

RxSwift:share() 替代方案,保证upstream 的单一订阅

Vapor - 流利的,将对象保存到 PostgreSQL

Swift 2 中的新 @convention(c):我该如何使用它?

如何快速识别字符串中的大写和小写字符?

Swift 中的 CommonHMAC

为 UIImagePicker 设置委托返回错误