How to fetch Facebook user information in ios

旧巷老猫 提交于 2019-12-12 10:04:56

问题


I am trying to develop a simple app, which, retrieves data from Facebook, when the user connects to it. I tried this code for it.

NSArray *permissions = [[NSArray alloc] initWithObjects:@"user_birthday",@"user_hometown",@"user_location",@"email",@"basic_info", nil];

    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session,
                                                      FBSessionState status,
                                                      NSError *error) {
                                  }];

    [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSLog(@"%@", [result objectForKey:@"gender"]);
        NSLog(@"%@", [result objectForKey:@"hometown"]);
        NSLog(@"%@", [result objectForKey:@"birthday"]);
        NSLog(@"%@", [result objectForKey:@"email"]);
    }];

But when I run this code, it gives an error "FBSDKLog: Error for request to endpoint 'me': An open FBSession must be specified for calls to this endpoint."

Thanks in advance, really appreciate your help.


回答1:


The error is very appropriate, what it is trying to say is that request connection method should be called once the session is open. Now your

[FBSession openActiveSessionWithReadPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session,
                                                  FBSessionState status,
                                                  NSError *error) {
                              }];

method returns BOOL value true or false to specify you wether session is open or not(it tries to open synchronously). So first check the result of this call and the put it inside the code for fetching info. For eg.

 if (FBSession.activeSession.isOpen)
{
[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSLog(@"%@", [result objectForKey:@"gender"]);
    NSLog(@"%@", [result objectForKey:@"hometown"]);
    NSLog(@"%@", [result objectForKey:@"birthday"]);
    NSLog(@"%@", [result objectForKey:@"email"]);
}];

}

This should remove your error, but you still may not get the results.You may or may not get result on the very first call to this code but whenever the code for completion handler will be called, this method FBRequestConnection will also get called and at that time you'll get the results as it is an asynchronous call.

If it still doesn't work try this

 if (FBSession.activeSession.isOpen)
    {
        [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
            if (error)
            {
                NSLog(@"error:%@",error);

            }
            else
            {
                // retrive user's details at here as shown below
                NSLog(@"FB user first name:%@",user.first_name);
                NSLog(@"FB user last name:%@",user.last_name);
                NSLog(@"FB user birthday:%@",user.birthday);
            }
}];



回答2:


`(void)fbAccountConfigureWithBlock:(void (^)(id, NSString *))block { _block_data=block;

if(![SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self showAlertMessage:@"" message:@"Please go to settings and add at least one facebook account."];
        _block_data(nil,nil);
    });
    return;
}

ACAccountStore *store = [[ACAccountStore alloc]init];
ACAccountType *accountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

[store requestAccessToAccountsWithType:accountType
                               options:@{ACFacebookAppIdKey         : FacebookAppId,
                                         ACFacebookAudienceKey      : ACFacebookAudienceFriends,
                                         ACFacebookPermissionsKey   : @[@"email"]}
                            completion:^(BOOL granted, NSError *error)
 {
     if(granted){
         NSArray *array = [store accountsWithAccountType:accountType];
         if(!array.count){
             dispatch_sync(dispatch_get_main_queue(), ^{
                 [self showAlertMessage:@"" message:@"Please go to settings and add at least one facebook account."];
                 _block_data(nil,nil);
             });
         }
         else{
             ACAccount *account = array[0];
             SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                     requestMethod:SLRequestMethodGET
                                                               URL:[NSURL URLWithString:@"https://graph.facebook.com/me"]
                                                        parameters: @{@"fields":@"id,first_name,last_name,name,email,picture.height(180).width(180)"}];
             [request setAccount:account];

             [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
              {
                  if(!error){
                      NSDictionary *userData = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
                      NSLog(@"Facebook user data ----> %@",userData);
                      dispatch_async(dispatch_get_main_queue(), ^{
                          if(userData[@"error"] != nil)
                              [self attemptRenewCredentials:store account:account];
                          else
                              _block_data(userData,nil);
                      });
                  }
                  else{
                      dispatch_async(dispatch_get_main_queue(), ^{
                          [self showAlertMessage:@"" message:error.localizedDescription];
                          _block_data(nil,nil);
                      });
                  }
              }];
         }
     }
     else
     {
         dispatch_async(dispatch_get_main_queue(), ^{
             [self showAlertMessage:@"" message:@"We need permission to access your facebook account in order make registration."];
             _block_data(nil,nil);
         });
     }
 }];

}`



来源:https://stackoverflow.com/questions/25256920/how-to-fetch-facebook-user-information-in-ios

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!