通过FacebookSDK.framework登录时没有收到电子邮件ID

时间:2015-07-14 12:17:05

标签: ios objective-c facebook facebook-graph-api

在我的应用程序中,我通过FacebookSDK.framework

登录facebook
- (IBAction)facebookLoginBtn1:(id)sender {
[FBSession openActiveSessionWithReadPermissions:@[@"email"] allowLoginUI:YES completionHandler:
 ^(FBSession *session, FBSessionState state, NSError *error) {
     AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
     [appDelegate sessionStateChanged:session state:state error:error];
     [[FBRequest requestForMe] startWithCompletionHandler:
      ^(FBRequestConnection *connection,
        NSDictionary<FBGraphUser> *user,
        NSError *error) {
          if (!error) {
              NSString *firstName = user.first_name;
              NSString *lastName = user.last_name;
              NSString *facebookId = user.id;
              NSString *email = [user objectForKey:@"email"];
              NSString *imageUrl = [[NSString alloc] initWithFormat: @"http://graph.facebook.com/%@/picture?type=large", facebookId];
              NSLog(@"%@",email);
              NSLog(@"%@",user.id);
              NSLog(@"%@",imageUrl);
          }
          else
          {

          }
      }];
 }];

}

和代码在我的旧应用程序中工作,但我在这里只获得FB ID和用户名。 我尝试过不同类型的权限和facebook id,但无法找出问题所在。

我在info plist和facebook开发者portle中做了完整的设置。  我只得到FBGraphUser对象的响应

 {
id = FB id;
name = “user name here“;}

作为回应。 这里没有我收到的电子邮件ID。 有人可以帮我从这里出去吗。 它应该是我想念的小事。

2 个答案:

答案 0 :(得分:2)

尝试此代码。基于Facebook SDK 4.0版

<强> ViewController.m

- (IBAction)btnFacebookPressed:(id)sender {
    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 ([result.grantedPermissions containsObject:@"email"])
             {
                 NSLog(@"result is:%@",result);
                 [self fetchUserInfo];
             }
         }
     }];
}

-(void)fetchUserInfo
{
    if ([FBSDKAccessToken currentAccessToken])
    {
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);

        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, link, first_name, last_name, picture.type(large), email, birthday, bio ,location ,friends ,hometown , friendlists"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error)
             {
                 NSLog(@"resultis:%@",result);
             }
             else
             {
                 NSLog(@"Error %@",error);
             }
         }];

    }

}

ViewDidLoad调用此方法,您在登录后获得访问令牌

[self fetchUserInfo];

以这种方式传递参数以获取电子邮件,姓名等。

@{@"fields": @"id, name, link, first_name, last_name, picture.type(large), email, birthday, bio ,location ,friends ,hometown , friendlists"}

答案 1 :(得分:1)

您必须指定要立即获取的字段,即使用户授权该权限,以下API调用也不会返回该电子邮件:

/me

这是您再次访问该电子邮件的方式:

/me?fields=id,email

更改日志:https://developers.facebook.com/docs/apps/changelog