2012-04-25 57 views
7

Estoy tratando de obtener acceso a la información de algunos usuarios, incluido el correo electrónico. Para este propósito, utilizo el API de gráficos para llamar a este método:Facebook iOS SDK no devuelve el correo electrónico del usuario

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

Devuelve la información del usuario, sin la información de correo electrónico (el cumpleaños también falta). Configuré todos los permisos y probé con más de una cuenta (que tiene el correo electrónico y el cumpleaños como información pública) y acepté todas las solicitudes del diálogo.

Aquí es mi 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]; 
} 

La devolución de llamada entrada:

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

    [self getUserInfo]; 
} 

El método getUserInfo:

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

La solicitud de devolución de llamada:

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

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

El resultado es el siguiente:

-> { 
    "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; 
} 

Como se puede ver, no hay información acerca de correo electrónico del usuario. ¿Me estoy perdiendo un paso? ¿Alguna ideia?

Gracias de antemano

+1

ninguna de estas respuestas funciona? o lo hacen? Se supone que debes seleccionar una respuesta correcta aquí para el beneficio de otros usuarios. – Dobler

Respuesta

7

intenta utilizar esto, funciona en mi caso

facebook = [[Facebook alloc] initWithAppId: [self _APP_KEY] yDelegate: self]; [facebook autorice: [NSArray arrayWithObjects: @ "email", nil]];

0

Sólo se puede acceder al correo electrónico de un usuario si se obtiene la autorización del usuario para ello.

El gráfico público no proporciona esta información.

Usted debe leer esto: https://developers.facebook.com/docs/guides/web/#login

+0

esta guía es para la API web. La pregunta es por el acceso desde ios sdk – Dobler

1

que pueda obtener el correo electrónico del usuario como esto ..después de la llamada fbDidlogin despedido este método

- (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]; 
} 

y en el request:(FBRequest *)request didLoad que va a hacer algo como esto:

- (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"]); 
      } 
     } 
} 

Enjoy :)

0

que necesita para pedir permiso al usuario para obtener esta información a través de:

- (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]; 
           }]; 

}

Aquí está toda la información que necesita, sólo tienes que seguir estos tutoriales

En primer lugar, éste : Facebook Login

Y luego, este: Fetch user data

3

Pruebe esto permisos = [[NSArray alloc] initWithObjects: @ "offline_access", @ "email", nil];

1

1) Dar permiso para obtener el correo electrónico y la información, etc ...

// 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) para obtener el correo electrónico en la que desea ...

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

Nota: El diccionario del usuario volverá después de

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

Todas las cuentas de facebook que son verificadas a través número de teléfono en lugar de correo electrónico recibirá NULL para [user objectForKey:@"email"]

Cuestiones relacionadas