Подтвердить что ты не робот

Facebook SDK 3.0: как получить электронное письмо пользователя?

В "старом" FB iOS SDK я мог получить информацию о пользователе через следующее:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"SELECT uid, name, email, pic FROM user WHERE uid=me()", @"query",
                                   nil];

    JBFacebookManager *fbManager = [JBFacebookManager getInstance];
    fbManager.requestDelegate = self;

    [fbManager.facebook requestWithMethodName:@"fql.query"
                                     andParams:params
                                 andHttpMethod:@"POST"
                                   andDelegate:self];

Как я могу сделать это с помощью нового FB iOS SDK 3.0? Нужно ли использовать FBRequest или FBOpenGraphAction или FBGraphObject или комбинацию тех или иных совершенно разных?

4b9b3361

Ответ 1

if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
         if (!error) {
             self.nameLabel.text = user.name;
             self.emailLabel.text = [user objectForKey:@"email"];
         }
     }];
}

Поскольку FBGraphUser не имеет электронной почты @property, мы не можем получить доступ к информации, подобной имени (dot-syntax), однако в NSDictionary все еще есть kv-пара электронной почты, и мы можем получить к ней доступ, как мы будем делать с нормальным NSDictionary.

Не забудьте спросить разрешение на электронную почту:

NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil];
[FBSession sessionOpenWithPermissions:permissions completionHandler:
 ^(FBSession *session, FBSessionState state, NSError *error) {
     [self facebookSessionStateChanged:session state:state error:error];
 }];

Ответ 2

Как только у вас будет доступ к (id<FBGraphUser>)user, вы можете просто использовать user[@"email"].

Ответ 3

Вы прочитали исходный код 3.0 SDK? Существует метод, который, как я думаю, идентичен:

- (FBRequest*)requestWithMethodName:(NSString *)methodName
                          andParams:(NSMutableDictionary *)params
                      andHttpMethod:(NSString *)httpMethod
                        andDelegate:(id <FBRequestDelegate>)delegate;

Ответ 4

из этого мы можем получить основную информацию пользователя и адрес электронной почты пользователя facebook.

[FBSession openActiveSessionWithReadPermissions:@[@"basic_info",@"email"] allowLoginUI:YES completionHandler:^(FBSession *session,FBSessionState status,NSError *error){
        if(error)
        {
            NSLog(@"Facebook Error : %@",error.localizedDescription);
        }
        else{

        }
        // Respond to session state changes,
        // ex: updating the view

    }];

Ответ 5

Самый простой способ получения информации после входа в систему:

-(IBAction)loginWithFacebook:(id)sender{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login
 logInWithReadPermissions: @[@"public_profile",@"email"]
 fromViewController:self
 handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
     if (error) {
         NSLog(@"Process error");
     } else if (result.isCancelled) {
         NSLog(@"Cancelled");
     } else {
         NSLog(@"Logged in");
         [self getFacebookProfileInfos];

     }
  }];
}

-(void)getFacebookProfileInfos {
NSDictionary *parameters = @ {@"fields": @"id, name, first_name, last_name, picture.type(large), email"};
if ([FBSDKAccessToken currentAccessToken]) {
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
         if (!error) {
             NSLog(@"fetched user:%@", result);
         }
     }];
}

}

Вы получите всю информацию о результатах.