2016-02-11 22 views
2

我尝试从已登录的Facebook用户获取至少id,用户名和电子邮件。我首先使用权限类型:电子邮件登录。如果成功尝试获取一个FBSDKGraphRequest,它将返回每个可能的值,但会发送电子邮件。FBSDK findByGraphPath(me)即使有权限和显式字段也不会返回电子邮件

我尝试添加像public_profile这样的权限,但无论如何我尝试了,我没有收到电子邮件。我查看了开发人员仪表板,并且电子邮件似乎被默认批准。

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; 
[loginManager logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
    if (error) { 
     NSLog(@"Error: %@", error); 
     return; 
    } else if (result.isCancelled) { 
     return; 
    } 

    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, gender, first_name, last_name, locale, email"}]; 

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@", error); 
      return; 
     } 

     NSLog(@"Fetched user: %@", result); 
    }]; 
}]; 
+1

请记住,一个)不是与Facebook(FE当他们注册使用他们的移动电话),和b)的电子邮件地址才会返回文件中的每个用户_has_和电子邮件地址,如果用户有验证它。 – CBroe

+0

ouch,发现情况是这样;) – sjors

回答

0

我只是有同样的问题,我很幸运找到注释的解决方案。它由CBroe给出。我认为这应该作为答案发布。

所以......在我的情况下,问题是用户还没有确认他的电子邮件。一旦我确认,我收到了Facebook的电子邮件。所有acknowledgemnts是CBroe

0

单击登录按钮时使用以下代码。

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; 
[loginManager setLoginBehavior:FBSDKLoginBehaviorSystemAccount]; 
[loginManager logInWithReadPermissions:@[@"public_profile", @"email", @"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
{ 
    if (error) 
    { 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
     [loginManager logOut]; 
    } 
    else if (result.isCancelled) 
    { 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
     [loginManager logOut]; 
    } 
    else 
    { 
     if ([result.grantedPermissions containsObject:@"publish_actions"]) 
     { 
      NSTimeInterval addTimeInterval = 60*60*24*365*50; 
      NSDate *expireDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval]; 
      NSDate *refreshDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval]; 

      FBSDKAccessToken *newAccessToken = [[FBSDKAccessToken alloc] initWithTokenString:[[FBSDKAccessToken currentAccessToken] tokenString] permissions:nil declinedPermissions:nil appID:FACEBOOK_ID userID:[[FBSDKAccessToken currentAccessToken] userID] expirationDate:expireDate refreshDate:refreshDate]; 
      [FBSDKAccessToken setCurrentAccessToken:newAccessToken]; 
      [self FacebookUserInfo]; 
     } 
     else 
     { 
      [loginManager logInWithPublishPermissions:@[@"publish_actions"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
      { 
       if (error) 
       { 
        [MBProgressHUD hideHUDForView:self.view animated:YES]; 
        [loginManager logOut]; 
       } 
       else if (result.isCancelled) 
       { 
        [MBProgressHUD hideHUDForView:self.view animated:YES]; 
        [loginManager logOut]; 
       } 
       else 
       { 
        NSTimeInterval addTimeInterval = 60*60*24*365*50; 
        NSDate *expireDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval]; 
        NSDate *refreshDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval]; 

        FBSDKAccessToken *newAccessToken = [[FBSDKAccessToken alloc] initWithTokenString:[[FBSDKAccessToken currentAccessToken] tokenString] permissions:nil declinedPermissions:nil appID:FACEBOOK_ID userID:[[FBSDKAccessToken currentAccessToken] userID] expirationDate:expireDate refreshDate:refreshDate]; 
        [FBSDKAccessToken setCurrentAccessToken:newAccessToken]; 
        [self FacebookUserInfo]; 
       } 
      }]; 
     } 
    } 
}]; 

一旦您获得访问令牌调用以下方法。

- (void)FacebookUserInfo 
{ 
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields":@"name,email,first_name,last_name"}] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
    { 
     if (!error) 
     { 
      NSDictionary *dict = @{@"id":result[@"id"], 
              @"name":result[@"first_name"], 
              @"email":result[@"email"] 
              }; 
      [self saveData:dict]; 
     } 
     else 
     { 

     } 
    }]; 
} 

可能这是对你有帮助。

+0

FBSDKAccessToken交换工作,但我认为SDK默认情况下隐式执行此操作。此外,该策略仍然不能让我访问用户的电子邮件。 – sjors

+0

请按照https://developers.facebook.com/链接获取最佳做法。 –

+0

@SjorsSnoeren请尝试上面更改的代码。 –

2

您的代码应该是这样的

-(void)loginWithFacebookButtonTouchUpInside 
{ 
    if(![FBSDKAccessToken currentAccessToken]) 
    { 
     FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
     [login logInWithReadPermissions:@[@"email",@"public_profile"] fromViewController:nil 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 
       [self userLoggedIn]; 
      } 

     }]; 
    }else{ 
     //error "Authentication is not done" 
    } 
} 

- (void)userLoggedIn 
{ 
    [FBSDKProfile enableUpdatesOnAccessTokenChange:NO]; 
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"name, email,first_name,last_name"}] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id userInfo, NSError *error) { 
     if (!error) { 
      { 

      } 
     } 
    }]; 
} 
相关问题