Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve email FacebookSDK and Swift

I'm successfully implemented facebook login in my app, but I'm not able to query/retrieve the email address from the user.

I have the following code:

import UIKit

class testViewController: UIViewController, FBSDKLoginButtonDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        if (FBSDKAccessToken.currentAccessToken() != nil)
        {
            // User is already logged in, do work such as go to next view controller.

            // Or Show Logout Button
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = self.view.center
            loginView.readPermissions = ["public_profile", "email", "user_friends"]
            loginView.delegate = self
            self.returnUserData()
        }
        else
        {
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = self.view.center
            loginView.readPermissions = ["public_profile", "email", "user_friends"]
            loginView.delegate = self
        }

    }

    // Facebook Delegate Methods

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        println("User Logged In")

        if ((error) != nil)
        {
            // Process error
        }
        else if result.isCancelled {
            // Handle cancellations
        }
        else {
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if result.grantedPermissions.contains("email")
            {
                // Do work
            }

            self.returnUserData()
        }

    }

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
        println("User Logged Out")
    }

    func returnUserData() {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

            if ((error) != nil)
            {
                // Process error
                println("Error: \(error)")
            }
            else
            {
                println("fetched user: \(result)")
                let userName : NSString = result.valueForKey("name") as! NSString
                println("User Name is: \(userName)")
                let userEmail : NSString = result.valueForKey("email") as! NSString
                println("User Email is: \(userEmail)")
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

And the println output:

fetched user: {
    id = 808101565906152;
    name = "Marcelo Pontes Machado";
}

When I try to display the email I got a nill value.

I think the code is right, maybe some SDK that I miss to import?

like image 386
Marcelo Pontes Machado Avatar asked Jul 22 '15 17:07

Marcelo Pontes Machado


2 Answers

Put the fields you want back from the Graph request in your parameters

FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id,email,name,picture.width(480).height(480)"]).startWithCompletionHandler({

Because the Graph API may sometimes only return a minimum amount of information unless otherwise requested.

like image 124
Fred Faust Avatar answered Sep 22 '22 07:09

Fred Faust


  1. In Swift

    if((FBSDKAccessToken.current()) != nil)
    {
        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler:
            { (connection, result, error) -> Void in
                if (error == nil)
                {
                    //everything works print the user data
                    //                        print(result!)
                    if let data = result as? NSDictionary
                    {
                        let firstName  = data.object(forKey: "first_name") as? String
                        let lastName  = data.object(forKey: "last_name") as? String
    
                        if let email = data.object(forKey: "email") as? String
                        {
                            print(email)
                        }
                        else
                        {
                             // If user have signup with mobile number you are not able to get their email address
                            print("We are unable to access Facebook account details, please use other sign in methods.")
                        }
                    }
                }
        })
    }
    
  2. In Objective C wire this code

    // START_LOADING;
    
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
                                       parameters:@{@"fields": @"picture, email,first_name,last_name"}]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
     {
         if (!error)
         {
             if ([result valueForKey:@"email"] != nil)
             {
                 NSLog([result valueForKey:@"email"]);
             }
             else
             {
                // If user have signup with mobile number you are not able to get their email address
               NSLog(@"We are unable to access Facebook account details, please use other sign in methods.");  
               //  STOP_LOADING;
             }
         }
     }];
    
like image 44
Jignesh Mayani Avatar answered Sep 20 '22 07:09

Jignesh Mayani