StuartM
StuartM

Reputation: 6823

Facebook SDK collecting user information and friends

I am trying to use the Facebook SDK to collect user information and friends. Ideally I would like to use FBRequest as opposed to FBConnectionRequest. As detailed on the Facebook Developer page it says to use FBRequest for multiple requests for information and Connection for one only.

An FBRequest object may be reused to issue multiple connections to Facebook. However each FBRequestConnection instance will manage one connection.

Source

I have currently setup a FBRequestConnection as follows which is working fine:

[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id<FBGraphUser> user, NSError *error) 

What I am trying to achieve is collect the user information such as name, username and email address etc (which works fine with the above, I have already handled the session/with permissions for this.

Now I need to change the connection so that it is an FBRequest, this way I can use the following delegate method:

- (void)request:(FBRequest *)request didLoad:(id)result {

Then within the delegate method, I will call a second requestForMyFriends and handle both lots of information in a single method. My creation of the request is completed in within my login block and is simply this:

    FBRequest *request = [FBRequest requestForGraphPath:@"me/?fields=name,picture"];
    [request startWithCompletionHandler:NULL];

Firstly, is this the correct way to approach this?

Secondly, I receive an error when it gets to the FBRequest so there must be an issue here but I am unsure what is incorrect. I cannot find further information on Facebook, but if anyone can point me in the right direction of a tutorial using this method that would also help.

EDIT -- Error enter image description here

EDIT 2 -- Additional code sample

// TODO : logging can be turned off/removed
[FBSettings setLoggingBehavior:[NSSet setWithObjects:FBLoggingBehaviorFBRequests, nil]];

NSDictionary *params = @{ @"fields" : @[ @"name", @"picture" ] };
FBRequest *request = [FBRequest requestWithGraphPath:@"me"
                                          parameters:params
                                          HTTPMethod:nil]; //nil will default on GET
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {}];

Upvotes: 4

Views: 2123

Answers (2)

LuAndre
LuAndre

Reputation: 1133

Obtaining a user permission with with READ Access only

    let permissionsDesired = ["email", "public_profile", "user_friends"]

    let facebookLogin = FBSDKLoginManager()
    facebookLogin.logInWithReadPermissions(permissionsDesired,
                                        fromViewController: sender)
        { (facebookLogin:FBSDKLoginManagerLoginResult!, facebookError:NSError!) -> Void in

            if facebookError != nil
            {
                print("Facebook login. Error: \(facebookError.localizedDescription)")

                self.delegate?.permissionResults(false)
            }
            else
            {
                   // access granted, you can start 
                   //requesting user data now
                   self.requestUserInfo()
            }
    }

Below is how to get User Data after you have the user has granted permission

func requestUserInfo( )
{

    let graphPath:String            = "me"
    let httpMethod:String           = "GET"
    var listOfrequest:String = String("about")
    listOfrequest = listOfrequest .stringByAppendingString(",age_range")
    listOfrequest = listOfrequest .stringByAppendingString(",bio")
    listOfrequest = listOfrequest .stringByAppendingString(",birthday")
    listOfrequest = listOfrequest .stringByAppendingString(",context")
    listOfrequest = listOfrequest .stringByAppendingString(",cover")
    listOfrequest = listOfrequest .stringByAppendingString(",currency")
    listOfrequest = listOfrequest .stringByAppendingString(",devices")
    listOfrequest = listOfrequest .stringByAppendingString(",education")
    listOfrequest = listOfrequest .stringByAppendingString(",email")
    listOfrequest = listOfrequest .stringByAppendingString(",favorite_athletes")
    listOfrequest = listOfrequest .stringByAppendingString(",favorite_teams")
    listOfrequest = listOfrequest .stringByAppendingString(",first_name")
    listOfrequest = listOfrequest .stringByAppendingString(",gender")
    listOfrequest = listOfrequest .stringByAppendingString(",hometown")
    listOfrequest = listOfrequest .stringByAppendingString(",id")
    listOfrequest = listOfrequest .stringByAppendingString(",inspirational_people")
    listOfrequest = listOfrequest .stringByAppendingString(",installed")
    listOfrequest = listOfrequest .stringByAppendingString(",install_type")
    listOfrequest = listOfrequest .stringByAppendingString(",is_shared_login")
    listOfrequest = listOfrequest .stringByAppendingString(",is_verified")
    listOfrequest = listOfrequest .stringByAppendingString(",languages")
    listOfrequest = listOfrequest .stringByAppendingString(",last_name")
    listOfrequest = listOfrequest .stringByAppendingString(",link")
    listOfrequest = listOfrequest .stringByAppendingString(",locale")
    listOfrequest = listOfrequest .stringByAppendingString(",location")
    listOfrequest = listOfrequest .stringByAppendingString(",meeting_for")
    listOfrequest = listOfrequest .stringByAppendingString(",middle_name")
    listOfrequest = listOfrequest .stringByAppendingString(",name")
    listOfrequest = listOfrequest .stringByAppendingString(",name_format")
    listOfrequest = listOfrequest .stringByAppendingString(",payment_pricepoints")
    listOfrequest = listOfrequest .stringByAppendingString(",picture")
    listOfrequest = listOfrequest .stringByAppendingString(",political")
    listOfrequest = listOfrequest .stringByAppendingString(",public_key")
    listOfrequest = listOfrequest .stringByAppendingString(",quotes")
    listOfrequest = listOfrequest .stringByAppendingString(",relationship_status")
    listOfrequest = listOfrequest .stringByAppendingString(",religion")
    listOfrequest = listOfrequest .stringByAppendingString(",security_settings")
    listOfrequest = listOfrequest .stringByAppendingString(",shared_login_upgrade_required_by")
    listOfrequest = listOfrequest .stringByAppendingString(",significant_other")
    listOfrequest = listOfrequest .stringByAppendingString(",sports")
    listOfrequest = listOfrequest .stringByAppendingString(",test_group")
    listOfrequest = listOfrequest .stringByAppendingString(",third_party_id")
    listOfrequest = listOfrequest .stringByAppendingString(",timezone")
    listOfrequest = listOfrequest .stringByAppendingString(",updated_time")
    listOfrequest = listOfrequest .stringByAppendingString(",verified")
    listOfrequest = listOfrequest .stringByAppendingString(",video_upload_limits")
    listOfrequest = listOfrequest .stringByAppendingString(",viewer_can_send_gift")
    listOfrequest = listOfrequest .stringByAppendingString(",website")
    listOfrequest = listOfrequest .stringByAppendingString(",work")

    let params:[NSObject:AnyObject] =  ["fields": listOfrequest ]

    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: graphPath,
                                                            parameters: params,
                                                            HTTPMethod: httpMethod)


    graphRequest.startWithCompletionHandler(
        { (connection:FBSDKGraphRequestConnection!, userData:AnyObject!, error:NSError!) -> Void in

            if (error == nil)
            {
               print(userData) 
            }
            else
            {
                print("Error: \(error.localizedDescription)")
                //Handle error here
            }
    })

}//eom

Upvotes: 0

Gabriele Petronella
Gabriele Petronella

Reputation: 108101

You are getting a EXC_BAD_ACCESS error since you cannot pass an empty completion handler block to the method.

The code below is tested and it works as intended.

FBRequest *request = [FBRequest requestForGraphPath:@"me/?fields=name,picture"];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSLog(@"%@", result);
}];

Upvotes: 3

Related Questions