How to get email for facebook using SLRequest in iOS Social Framework

I tried the below code to get the email of a person logged into iOS Settings Facebook. Please help me how to get email from SLRequest.

- (void) getMyDetails {
if (! _accountStore) {
    _accountStore = [[ACAccountStore alloc] init];
}

if (! _facebookAccountType) {
    _facebookAccountType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
}

NSDictionary *options = @{ ACFacebookAppIdKey: FB_APP_ID };

    [_accountStore requestAccessToAccountsWithType: _facebookAccountType
                                           options: options
                                        completion: ^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *accounts = [_accountStore accountsWithAccountType:_facebookAccountType];
            _facebookAccount = [accounts lastObject];

            NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];

            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                    requestMethod:SLRequestMethodGET
                                                              URL:url
                                                       parameters:nil];
            request.account = _facebookAccount;

            [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData
                                                                                   options:NSJSONReadingMutableContainers
                                                                                     error:nil];
                NSLog(@"id: %@", responseDictionary[@"id"]);

            }];
        } 
    }];
}

      

+3


source to share


2 answers


You can get the email id in the following way. Call the Facebook graphical API using the access token you got from the account store And yes, to get the email id from Facebook, you need to grant "email" permission when requesting an access token without permission, which you can't get by email ...

Here is my code

NSString *FB_EncodedToken = [APP_CONSTANT.facebookToken  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

AFHTTPRequestOperationManager *opearation = [AFHTTPRequestOperationManager manager];
opearation.requestSerializer = [AFHTTPRequestSerializer serializer];
opearation.responseSerializer = [AFJSONResponseSerializer serializer];

NSString *strUrl = [NSString stringWithFormat:@"https://graph.facebook.com/me?"];
NSDictionary *param = [NSDictionary dictionaryWithObjectsAndKeys:FB_EncodedToken,@"access_token", nil];

[opearation GET:strUrl parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
    DLogs(@"Description %@",responseObject);

    //Lets pasre the JSON data fetched from facebook
    [self parseUserDetail:responseObject];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    DLogs(@"Error description %@",error.description);
    self.completionHandler(error);
}];

      



Then let's analyze the data

-(void)parseUserDetail:(NSDictionary *)dict
{
    FBProfileBO *profile = [[FBProfileBO alloc] init];

    profile.userFirstName = [dict objectForKey:@"first_name"];
    profile.userLastName = [dict objectForKey:@"last_name"];
    profile.userEmail = [dict objectForKey:@"email"];
    profile.userName = [dict objectForKey:@"name"];
    profile.userDOB = [dict objectForKey:@""];
    profile.facebookId = [dict objectForKey:@"id"];

    //Call back methods
    self.completionHandler(profile);
    profile = nil;
}

      

+1


source


Here is a code tested on iOS 8 that returns email. The solution does not require the Facebook SDK, although the system only provides access to the Facebook account if the user is logged in with Facebook in the Settings app.



// Required includes
@import Accounts;
@import Social;

// Getting email
ACAccountStore *theStore = [ACAccountStore new];
ACAccountType *theFBAccountType = [theStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *theOptions = @{
    ACFacebookAppIdKey : @"YOUR_APP_ID",
    ACFacebookPermissionsKey : @[@"email"]
};
[theStore requestAccessToAccountsWithType:theFBAccountType options:theOptions completion:^(BOOL granted, NSError *error) {
    if (granted) {
        ACAccount *theFBAccount = [theStore accountsWithAccountType:theFBAccountType].lastObject;

        SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                requestMethod:SLRequestMethodGET
                                                          URL:[NSURL URLWithString:@"https://graph.facebook.com/me"]
                                                   parameters:@{@"fields" : @[@"email"]}];
        request.account = theFBAccount;

        [request performRequestWithHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (error == nil && ((NSHTTPURLResponse *)response).statusCode == 200) {
                NSError *deserializationError;
                NSDictionary *userData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&deserializationError];

                if (userData != nil && deserializationError == nil) {
                    NSString *email = userData[@"email"];
                    NSLog(@"%@", email);
                }
            }
        }];            
    }
}];

      

+2


source







All Articles