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

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

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

4b9b3361

Ответ 1

Чтобы получить электронную почту, вам нужно использовать API-интерфейс графика, в частности, указать поле параметров, заполненное нужными вами полями. Взгляните на инструмент API Graph Graph API, который поможет найти ответы на запросы. 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);
     }];

Ответ 2

Это правильно. Адрес электронной почты отсутствует в объекте FBSDKProfile. Вы должны использовать FB Graph API вместо этого. На сайте 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);       
      }
  }];
}

Ответ 3

Скорректированный код:

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

Ответ 4

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

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);
                     }
                 }];
            }
        }
    }
}];

Ответ 5

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

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"

Ответ 6

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

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

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

Ответ 7

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

"email,user_location"

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

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

"email,location"

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

Ответ 8

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