Я обновляю свое приложение до Facebook-iOS-SDK-4.0, но похоже, что я не могу получить электронную почту от пользователя FBSDKProfile
, так как он предоставляет только имя пользователя, пользователя и т.д..
[Facebook-iOS-SDK 4.0] Как получить адрес электронной почты пользователя из FBSDKProfile
Ответ 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) {
}
}];
}