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