Facebook的iOS SDK没有返回用户的电子邮件

问题描述:

我想要访问一些用户的信息,包括电子邮件。为此,我使用图形API来调用这个方法:Facebook的iOS SDK没有返回用户的电子邮件

[facebook requestWithGraphPath:@"me" andDelegate:self]; 

它返回的用户信息,而电子邮件信息(生日也丢失)。我设置了所有权限并使用多个帐户(其中包含电子邮件和生日作为公共信息)进行测试,并接受了所有对话的请求。

这里是我的init:

if(!facebook) { 
    facebook = [[Facebook alloc] initWithAppId:[self _APP_KEY] andDelegate:self]; 
    NSArray *array = [NSArray arrayWithObjects: @"email", @"user_birthday", @"publish_stream", @"offline_access", nil]; 
    [self setPermissions:array]; 
} 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { 
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
} 

if (![facebook isSessionValid]) { 
    [facebook authorize:permissions]; 
} 
else { 
    [self getUserInfo]; 
} 

登录回调:

- (void)fbDidLogin { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [self getUserInfo]; 
} 

的getUserInfo方法:

- (void) getUserInfo { 
    [facebook requestWithGraphPath:@"me" andDelegate:self]; 
} 

请求回调:

- (void)request:(FBRequest *)request didLoad:(id)result { 

    if ([result isKindOfClass:[NSDictionary class]]) { 
     NSDictionary* json = result; 
     NSLog(@"-> %@", json); 
    } 
} 

结果如下:

-> { 
    "first_name" = EDITED (my name); 
    gender = male; 
    hometown =  { 
     id = 111072692249998; 
     name = "Porto Alegre"; 
    }; 
    id = 653099452; 
    languages =  (
       { 
      id = 104034306299811; 
      name = "Brazilian Portuguese"; 
     }, 
       { 
      id = 106059522759137; 
      name = English; 
     } 
    ); 
    "last_name" = EDITED (my last name); 
    link = EDITED (my profile); 
    locale = "en_US"; 
    location =  { 
     id = 112047398814697; 
     name = "S\U00e3o Paulo, Brazil"; 
    }; 
    name = EDITED (my name); 
    timezone = "-3"; 
    "updated_time" = "2012-04-25T13:36:51+0000"; 
    verified = 1; 
} 

正如你所看到的,没有关于该用户的电子邮件信息。我错过了一些步骤?任何意识?

在此先感谢

+1

以上答案都不对工作的所有Facebook账户?或者他们?为了其他用户的利益,您应该选择正确的答案。 – Dobler 2012-08-11 04:36:10

尝试使用此,它的作品在我的情况

facebook = [[Facebook alloc] initWithAppId:[self _APP_KEY] andDelegate:self]; [facebook授权:[NSArray arrayWithObjects:@“email”,nil]];

如果您获得用户的授权,您只能访问用户的电子邮件。

公共图示没有提供该信息。

你应该阅读:https://developers.facebook.com/docs/guides/web/#login

+0

本指南适​​用于web api。问题是从ios sdk访问 – Dobler 2012-08-11 04:27:55

你可以得到用户的电子邮件这样的..后fbDidlogin解雇调用此方法

- (void)fetchUserDetails { 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            @"SELECT uid, name, pic, email FROM user WHERE uid=me()", @"query",nil]; 

    [fb requestWithMethodName:@"fql.query" 
            andParams:params 
           andHttpMethod:@"POST" 
            andDelegate:self]; 
} 

,并在request:(FBRequest *)request didLoad,你会做这样的事情:

- (void)request:(FBRequest *)request didLoad:(id)result 
{ 

    if([request.url rangeOfString:@"fql.query"].location !=NSNotFound) 
    { 
     if ([result isKindOfClass:[NSArray class]] && [result count]>0) { 
      result = [result objectAtIndex:0]; 
     } 

     if ([result objectForKey:@"email"]) { 

      NSLog(@"%@",[result objectForKey:@"email"]); 
      } 
     } 
} 

享受:)

您需要通过请求允许用户输入以下信息:

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { 
NSArray *permissions = [[NSArray alloc] initWithObjects: 
         @"user_birthday", 
         nil]; 
return [FBSession openActiveSessionWithPermissions:permissions 
             allowLoginUI:allowLoginUI 
           completionHandler:^(FBSession *session, 
                FBSessionState state, 
                NSError *error) { 
            [self sessionStateChanged:session 
                 state:state 
                 error:error]; 
           }]; 

}

这里有您需要的所有信息,只要按照这个教程

首先,这一个:Facebook Login

然后,这一个:Fetch user data

试试这个 permissions = [[NSArray alloc] initWithObjects:@“offline_access”,@“email”,nil];

1)给获得电子邮件和信息等方面的权限...

// You must ALWAYS ask for public_profile permissions when opening a session 
       [FBSession openActiveSessionWithReadPermissions:@[@"public_profile",@"user_videos",@"email"] 
                allowLoginUI:YES 
               completionHandler: 
       ^(FBSession *session, FBSessionState state, NSError *error) 
       { 
        // Retrieve the app delegate 
        AppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
        // Call the app delegate's sessionStateChanged:state:error method to handle session state changes 
        [appDelegate sessionStateChanged:session state:state error:error]; 
       }]; 

2),以获得您想要的电子邮件...

if (FBSession.activeSession.isOpen) 
    { 
     [[FBRequest requestForMe] startWithCompletionHandler: 
     ^(FBRequestConnection *connection, 
      NSDictionary<FBGraphUser> *user, 
      NSError *error) 
     { 
      if (!error) 
      { 
       NSString *userEmail = [user objectForKey:@"email"]; 
      } 
      [tblSettingVw reloadData]; 
     }]; 
    } 

注:用户词典将返回以下内容

{ 
    "first_name" =; 
    gender =; 
    id =; 
    "last_name" =; 
    link = ""; 
    locale = ""; 
    name = ""; 
    timezone = ""; 
    "updated_time" = ""; 
    verified = ; 
} 

它们通过电话号码,而不是电子邮件验证将获得NULL[user objectForKey:@"email"]