2015-03-28 5 views
43

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

+0

Я пробовал тот же код, что и в вашем принятом ответе, однако я не получаю идентификатор электронной почты, хотя у меня есть разрешение «электронной почты». Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax

+3

** Проблема разрешена в двух экземплярах: ** http://stackoverflow.com/a/31503463/3382676 – HeTzi

+0

Я еще не пробовал, но это кажется законным. Спасибо @HeTzi – imcc

ответ

125

Для выборки по электронной почте вам необходимо использовать граф API, в частности, обеспечивая поле параметров населенного с полями, которые вы хотите , Взгляните на инструмент API API 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); 
    }]; 
+1

Это решение отлично работает. Благодарю. – Joni

+5

Ты спасаешь мою жизнь! –

+1

действительно работал как в старых sdk, так и в новом sdk .... –

26

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

, вот что я делаю прямо сейчас, но это пустая трата ресурсов. – imcc

+12

У этого запроса нет сообщения в результатах. –

+4

Я пытался войти в систему следующим образом: fbLoginManager.logInWithReadPermissions (["email", "public_profile"] ... и письмо по-прежнему не отправлено в объекте результата. Кто-нибудь знает, как это сделать? –

6

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

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

Я пробовал один и тот же код, но я не получаю идентификатор электронной почты, хотя у меня есть " электронной почты ". Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax

+1

извините за поздний ответ, убедитесь, что ваш адрес электронной почты подтвержден для учетной записи facebook, если нет, то вам может потребоваться повторно отправить варификационный адрес электронной почты из вашей учетной записи facebook и нажать ссылку для проверки электронной почты –

+1

На самом деле я нашел решение. Для последней версии Graph api нам необходимо передать параметры в графическом пути, т.е. @ "me/emailId? location" явно. Он не упоминался в их документации. – ViruMax

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

Я пробовал один и тот же код, но я не получаю идентификатор электронной почты, хотя у меня есть разрешение «электронной почты». Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax

+0

Убедитесь, что ваша электронная почта была подтверждена, нажав на ссылку, отправленную facebook, это также может вызвать проблемы. –

1

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

"email,user_location"

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

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

"email,location"

Надежда, что помогает кто-то!

1

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

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

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

2

Этих параметры дает письмо

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 должны содержать явные «поля» параметр