iOS Facebook获取用户的电子邮件

我尝试了2000多件事情来获取用户的电子邮件。 我无法从Facebook SDK的graphicsAPI中获取它。 它不包含电子邮件属性。 我也尝试手动添加电子邮件属性到FB框架,什么都没有发生。 是否可以下载与iOS 7兼容的第一个FB SDK? 它是否还有电子邮件属性,不是吗? 或者还有什么其他方式如何获得真正的电子邮件,我必须与他们合作。 我不需要example@facebook.com。

感谢您的任何build议。

编辑

NSArray *permissions = @[@"email", @"public_profile"]; [PFFacebookUtils logInWithPermissions:permissions block:^(PFUser *user, NSError *error) { if (!user) { if (!error) { NSLog(@"The user cancelled the Facebook login."); } else { NSLog(@"An error occurred: %@", error.localizedDescription); } if ([delegate respondsToSelector:@selector(commsDidLogin:)]) { [delegate commsDidLogin:NO]; } } else { if (user.isNew) { NSLog(@"User signed up and logged in through Facebook!"); } else { NSLog(@"User logged in through Facebook!"); } [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error) { PFUser *usere = [PFUser currentUser]; [usere setObject:[result objectForKey:@"first_name"] forKey:@"name"]; [usere setObject:[result objectForKey:@"last_name"] forKey:@"surname"]; // [usere setObject:[result objectForKey:@"email"] forKey:@"mail"]; [usere saveEventually]; NSLog(@"user info: %@", result); } }]; } if ([delegate respondsToSelector:@selector(commsDidLogin:)]) { [delegate commsDidLogin:YES]; } }]; } 

我没有编写graphicsAPI的代码,

但与新的Facebook SDK版本3,我有代码。

 -(void)openFbSession { [[self appDelegate].session closeAndClearTokenInformation]; NSArray *permissions = [NSArray arrayWithObjects:@"email",@"user_location",@"user_birthday",@"user_hometown",nil]; [self appDelegate].session = [[FBSession alloc] initWithPermissions:permissions]; [[self appDelegate].session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if(!error) { NSLog(@"success"); [self myFbInfo]; } else { NSLog(@"failure"); } }]; } 

对于所有的信息,myFbInfo方法是

 -(void)myFbInfo { [FBSession setActiveSession:[self appDelegate].session]; [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *FBuser, NSError *error) { if (error) { // Handle error } else { //NSString *userName = [FBuser name]; //NSString *userImageURL = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", [FBuser id]]; NSLog(@"Name : %@",[FBuser name]); NSLog(@"first name : %@",[FBuser first_name]); NSLog(@"Last name : %@",[FBuser last_name]); NSLog(@"ID : %@",[FBuser id]); NSLog(@"username : %@",[FBuser username]); NSLog(@"Email : %@",[FBuser objectForKey:@"email"]); NSLog(@"user all info : %@",FBuser); } }]; } 

编辑


在appdelegate.h中

 @property (strong, nonatomic) FBSession *session; 

在appdelegate.m

 - (BOOL)application: (UIApplication *)application openURL: (NSURL *)url sourceApplication: (NSString *)sourceApplication annotation: (id)annotation { //NSLog(@"FB or Linkedin clicked"); return [self.session handleOpenURL:url]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [FBSession.activeSession handleDidBecomeActive]; } - (void)applicationWillTerminate:(UIApplication *)application { [self.session close]; } 

您必须先请求权限,详见https://developers.facebook.com/docs/facebook-login/ios/v2.0#button-permissions

之后,您可以请求用户的信息: https : //developers.facebook.com/docs/ios/graph#userinfo

你不能只是得到用户的电子邮件地址,你必须要求他们这样做的权限。 看看这个:
https://developers.facebook.com/docs/facebook-login/permissions/v2.0

Facebook Connect将允许scope=email在您的身份validation电话的getstring中传递。

我无法用上面的例子来解决这个问题。 我用一个更复杂的FBSDKGraphRequest调用来解决这个问题。

在viewDidLoad中:

 if(FBSDKAccessToken.currentAccessToken() != nil) { println("Logged in to FB") self.returnUserData() //Specified here below } else { print("Not logged in to FB") let loginView : FBSDKLoginButton = FBSDKLoginButton() loginView.center = self.view.center loginView.readPermissions = ["public_profile", "email", "user_friends"] loginView.delegate = self self.view.addSubview(loginView) } } 

上面的读取权限对于在您从FB服务器请求时能够稍后获取它很重要。

请记住遵守“FBSDKLoginButtonDelegate”协议,包括所需的function(这里不包括)。

为了能够获取电子邮件等我使用更复杂的调用graphRequest并指定accesstoken和参数(下面)。

  let fbAccessToken = FBSDKAccessToken.currentAccessToken().tokenString let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest( graphPath: "me", parameters: ["fields":"email,name"], tokenString: fbAccessToken, version: nil, HTTPMethod: "GET") 

…在同一个函数中执行completionHandler:

 graphRequest.startWithCompletionHandler({ (connection, result, error) -> () in result if ((error) != nil) { // Process error println("Error: \(error)") } else { println("fetched user: \(result)") } } 

精美的作品!

另外..参数在这里列出:

https://developers.facebook.com/docs/graph-api/reference/v2.2/user

  if ([result.grantedPermissions containsObject:@"email"]) { // Do work NSLog(@"%@",[FBSDKAccessToken currentAccessToken]); if ([FBSDKAccessToken currentAccessToken]) { [[[FBSDKGraphRequest alloc] initWithGraphPath:@"/me" parameters:[NSMutableDictionary dictionaryWithObject:@"picture.type(large),id,email,name,gender" forKey:@"fields"] tokenString:result.token.tokenString version:nil HTTPMethod:@"GET"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"fetched user:%@", result); } }]; } }