Get email and name Facebook SDK v4.4.0 Swift

TL;TR: How do I get the email and name of a user that is logged in on my app using the facebook SDK 4.4

So far I have managed to get login working, now I can get the current access token from anywhere in the app.

How I have my login view controller and facebook login button configured:

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

Now on my main view I can get the access token like so:

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

How do I get the name and email from the user that is logged in, I see many question and answers using eather an older SDK or using Objective-C.

Answers 1

  • I've used fields in android, so I figured to try it in iOS as well, and it works.

    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 will print:

    result {
       email = "[email protected]";
       id = 123456789;
       name = "Your Name";
    }
    

    Found that these fields are equal to the User endpoint, see this link where you can see all the fields that you can get.

    Update for Swift 4 and above

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

    Update for Swift 5 with FBSDKLoginKit 6.5.0

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

Related Articles