[Facebook-iOS-SDK 4.0] Как получить адрес электронной почты пользователя из FBSDKProfile

Я обновляю свое приложение до Facebook-iOS-SDK-4.0, но кажется, что я не могу получить электронную почту пользователя от FBSDKProfile, поскольку он предоставляет только имя пользователя, идентификатор пользователя и т. д.

7 ответов

Решение

Для получения электронной почты вам нужно использовать API-интерфейс Graph, в частности, предоставив поле параметров, заполненное полями, которые вы хотите. Взгляните на инструмент исследования API Graph API от Facebook, который поможет выяснить запросы. https://developers.facebook.com/tools/explorer

Код, который работал для меня, чтобы получить электронную почту, следующий, что предполагает, что вы уже вошли в систему:

    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id,name,email" forKey:@"fields"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                  id result, NSError *error) {
         aHandler(result, error);
     }];

Правильно. Адрес электронной почты отсутствует в объекте FBSDKProfile. Вместо этого вы должны использовать Graph API FB. На сайте FB Developer есть множество информации и примеров кода https://developers.facebook.com/docs/ios/graph

Чтобы ответить на ваш вопрос, попробуйте что-то вроде этого.

if ([FBSDKAccessToken currentAccessToken]) {
   [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email"}]
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
      if (!error) {
         NSLog(@"user:%@", result);       
      }
  }];
}

Код исправлен:

  if ([FBSDKAccessToken currentAccessToken]) {
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
        startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                     id result, NSError *error) {
          if (!error) {
            NSLog(@"fetched user:%@", result);
          }
        }];
  }

Попробуйте этот код:

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) {
        // Process error
    } else if (result.isCancelled) {
        // Handle cancellations
    } else {
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing

        if ([result.grantedPermissions containsObject:@"email"]) {
            if ([FBSDKAccessToken currentAccessToken]) {
                [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
                 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                     if (!error) {
                         NSLog(@"fetched user:%@", result);
                     }
                 }];
            }
        }
    }
}];

Эти параметры дает адрес электронной почты

NSDictionary *parameters = @{@"fields":@"email"};

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{
    NSLog(@"fetched user:%@", result);
}];

начиная с Graph API v2.4, запросы GET для /me должны содержать явный параметр "fields"

С сайта разработчиков Facebook https://developers.facebook.com/docs/facebook-login/permissions/v2.2

Обратите внимание, что даже если вы запрашиваете разрешение электронной почты, это не гарантирует, что вы получите адрес электронной почты. Например, если кто-то подписался на Facebook с номером телефона вместо адреса электронной почты, поле электронной почты может быть пустым.

Надеюсь, это поможет кому-то:)

Я хотел добавить к этому то, что нашел. Для меня FBSDKGraphRequest Я пытался передать разрешения, которые я запрашивал при входе в систему, как поля. Итак, я устанавливал fields как то так:

"email,user_location"

Однако разрешения и поля разные. Для справки это поля: https://developers.facebook.com/docs/graph-api/reference/v2.4/user

Итак, на основе той ссылки, которую вы хотите передать:

"email,location"

Надеюсь, что это помогает кому-то!

if ([FBSDKAccessToken currentAccessToken]) {
   [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email"}]
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
      if (!error) {
                    }
  }];
}                    
Другие вопросы по тегам