Facebook SDK 3.0: как получить электронное письмо пользователя?
В "старом" FB iOS SDK я мог получить информацию о пользователе через следующее:
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"SELECT uid, name, email, pic FROM user WHERE uid=me()", @"query",
nil];
JBFacebookManager *fbManager = [JBFacebookManager getInstance];
fbManager.requestDelegate = self;
[fbManager.facebook requestWithMethodName:@"fql.query"
andParams:params
andHttpMethod:@"POST"
andDelegate:self];
Как я могу сделать это с помощью нового FB iOS SDK 3.0? Нужно ли использовать FBRequest
или FBOpenGraphAction
или FBGraphObject
или комбинацию тех или иных совершенно разных?
Ответы
Ответ 1
if (FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
self.nameLabel.text = user.name;
self.emailLabel.text = [user objectForKey:@"email"];
}
}];
}
Поскольку FBGraphUser
не имеет электронной почты @property
, мы не можем получить доступ к информации, подобной имени (dot-syntax), однако в NSDictionary все еще есть kv-пара электронной почты, и мы можем получить к ней доступ, как мы будем делать с нормальным NSDictionary.
Не забудьте спросить разрешение на электронную почту:
NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil];
[FBSession sessionOpenWithPermissions:permissions completionHandler:
^(FBSession *session, FBSessionState state, NSError *error) {
[self facebookSessionStateChanged:session state:state error:error];
}];
Ответ 2
Как только у вас будет доступ к (id<FBGraphUser>)user
, вы можете просто использовать user[@"email"]
.
Ответ 3
Вы прочитали исходный код 3.0 SDK? Существует метод, который, как я думаю, идентичен:
- (FBRequest*)requestWithMethodName:(NSString *)methodName
andParams:(NSMutableDictionary *)params
andHttpMethod:(NSString *)httpMethod
andDelegate:(id <FBRequestDelegate>)delegate;
Ответ 4
из этого мы можем получить основную информацию пользователя и адрес электронной почты пользователя facebook.
[FBSession openActiveSessionWithReadPermissions:@[@"basic_info",@"email"] allowLoginUI:YES completionHandler:^(FBSession *session,FBSessionState status,NSError *error){
if(error)
{
NSLog(@"Facebook Error : %@",error.localizedDescription);
}
else{
}
// Respond to session state changes,
// ex: updating the view
}];
Ответ 5
Самый простой способ получения информации после входа в систему:
-(IBAction)loginWithFacebook:(id)sender{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login
logInWithReadPermissions: @[@"public_profile",@"email"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
NSLog(@"Process error");
} else if (result.isCancelled) {
NSLog(@"Cancelled");
} else {
NSLog(@"Logged in");
[self getFacebookProfileInfos];
}
}];
}
-(void)getFacebookProfileInfos {
NSDictionary *parameters = @ {@"fields": @"id, name, first_name, last_name, picture.type(large), email"};
if ([FBSDKAccessToken currentAccessToken]) {
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (!error) {
NSLog(@"fetched user:%@", result);
}
}];
}
}
Вы получите всю информацию о результатах.