Reputation: 6823
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.
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
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
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
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