Я обновляю свое приложение до Facebook-iOS-SDK-4.0, но похоже, что я не могу получить электронное письмо от FBSDKProfile
, так как он предоставляет только имя пользователя, пользователя и т. д.[Facebook-iOS-SDK 4.0] Как получить адрес электронной почты пользователя от FBSDKProfile
ответ
Для выборки по электронной почте вам необходимо использовать граф 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);
}];
Это решение отлично работает. Благодарю. – Joni
Ты спасаешь мою жизнь! –
действительно работал как в старых sdk, так и в новом sdk .... –
Это правильно. Адрес электронной почты отсутствует в объекте 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);
}
}];
}
, вот что я делаю прямо сейчас, но это пустая трата ресурсов. – imcc
У этого запроса нет сообщения в результатах. –
Я пытался войти в систему следующим образом: fbLoginManager.logInWithReadPermissions (["email", "public_profile"] ... и письмо по-прежнему не отправлено в объекте результата. Кто-нибудь знает, как это сделать? –
Код исправлен:
if ([FBSDKAccessToken currentAccessToken]) {
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
id result, NSError *error) {
if (!error) {
NSLog(@"fetched user:%@", result);
}
}];
}
Я пробовал один и тот же код, но я не получаю идентификатор электронной почты, хотя у меня есть " электронной почты ". Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax
извините за поздний ответ, убедитесь, что ваш адрес электронной почты подтвержден для учетной записи facebook, если нет, то вам может потребоваться повторно отправить варификационный адрес электронной почты из вашей учетной записи facebook и нажать ссылку для проверки электронной почты –
На самом деле я нашел решение. Для последней версии Graph api нам необходимо передать параметры в графическом пути, т.е. @ "me/emailId? location" явно. Он не упоминался в их документации. – ViruMax
Попробуйте этот код:
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);
}
}];
}
}
}
}];
Я пробовал один и тот же код, но я не получаю идентификатор электронной почты, хотя у меня есть разрешение «электронной почты». Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax
Убедитесь, что ваша электронная почта была подтверждена, нажав на ссылку, отправленную facebook, это также может вызвать проблемы. –
Я хотел бы добавить к этим с тем, что я нашел. Для моего FBSDKGraphRequest
я пытался передать разрешения, которые я запрашивал при входе в систему как поля. Так что я садился fields
, как что-то вроде:
"email,user_location"
Однако разрешения и поля различны. Для справки, эти поля: https://developers.facebook.com/docs/graph-api/reference/v2.4/user
Так на основе этой ссылке вы хотите передать:
"email,location"
Надежда, что помогает кто-то!
С сайта разработчика facebook https://developers.facebook.com/docs/facebook-login/permissions/v2.2
Примечание, даже если вы запрашиваете разрешение по электронной почте, не гарантируется вы получите адрес электронной почты. Например, если кто-то подписался на Facebook с номером телефона вместо адреса электронной почты, поле электронной почты может быть пустым.
Надеется, что это поможет кому-то :)
Этих параметры дает письмо
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 должны содержать явные «поля» параметр
Я пробовал тот же код, что и в вашем принятом ответе, однако я не получаю идентификатор электронной почты, хотя у меня есть разрешение «электронной почты». Я получаю только идентификатор пользователя и имя пользователя в параметре результата. – ViruMax
** Проблема разрешена в двух экземплярах: ** http://stackoverflow.com/a/31503463/3382676 – HeTzi
Я еще не пробовал, но это кажется законным. Спасибо @HeTzi – imcc