2012-08-07 24 views
25

En la "vieja" FB SDK de iOS que pudiera recibir la información del usuario a través de lo siguiente:Facebook SDK 3.0: ¿cómo recibir el correo electrónico del usuario?

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

    JBFacebookManager *fbManager = [JBFacebookManager getInstance]; 
    fbManager.requestDelegate = self; 

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

¿Cómo se puede hacer esto con el nuevo FB SDK de iOS 3.0? ¿Debo utilizar FBRequest o FBOpenGraphAction o FBGraphObject o una combinación de esos o algo completamente diferente?

Respuesta

68
if (FBSession.activeSession.isOpen) { 
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
     if (!error) { 
      self.nameLabel.text = user.name; 
      self.emailLabel.text = [user objectForKey:@"email"]; 
     } 
    }]; 
} 

Debido FBGraphUser no tiene un correo electrónico @property, no podemos tener acceso a la información como el nombre (de sintaxis con punto), sin embargo el NSDictionary todavía tiene el par de kv de correo electrónico y podemos acceder a él como lo haríamos con un NSDictionary normal.

No se olvide de pedir el permiso de correo electrónico sin embargo:

NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil]; 
[FBSession sessionOpenWithPermissions:permissions completionHandler: 
^(FBSession *session, FBSessionState state, NSError *error) { 
    [self facebookSessionStateChanged:session state:state error:error]; 
}]; 
+4

sessionOpenWithPermissions: @ [@ "email"]; para una línea corta y más legible. –

+0

¿hay alguna manera como FBLoginView de que con una WS pueda obtener la información del usuario? Así (por cierto, así es como lo implementé), si quieres iniciar sesión en tu propio sistema después del inicio de sesión de Facebook tienes 3 WS consecutivos. –

1

¿Has leído el código fuente del 3.0 SDK? Hay un método que creo que es idéntica:

- (FBRequest*)requestWithMethodName:(NSString *)methodName 
          andParams:(NSMutableDictionary *)params 
         andHttpMethod:(NSString *)httpMethod 
         andDelegate:(id <FBRequestDelegate>)delegate; 
+0

No es exactamente lo mismo: https://developers.facebook.com/docs/sdk-reference/iossdk/3.0/class/FBRequest/. Descubrí una solución y la publiqué también. – znq

1

de esta podemos obtener información básica y correo electrónico facebook Identificación del usuario.

[FBSession openActiveSessionWithReadPermissions:@[@"basic_info",@"email"] allowLoginUI:YES completionHandler:^(FBSession *session,FBSessionState status,NSError *error){ 
     if(error) 
     { 
      NSLog(@"Facebook Error : %@",error.localizedDescription); 
     } 
     else{ 

     } 
     // Respond to session state changes, 
     // ex: updating the view 

    }]; 
+0

Gracias Olvidé agregar @ "email" en los permisos – Jasmeet

5

Una vez que tenga acceso a (id<FBGraphUser>)user, simplemente se podría utilizar, user[@"email"].

+0

super duper gokill! – tesmojones

0

El método más sencillo para obtener la información después de acceder es:

-(IBAction)loginWithFacebook:(id)sender{ 
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
[login 
logInWithReadPermissions: @[@"public_profile",@"email"] 
fromViewController:self 
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
    if (error) { 
     NSLog(@"Process error"); 
    } else if (result.isCancelled) { 
     NSLog(@"Cancelled"); 
    } else { 
     NSLog(@"Logged in"); 
     [self getFacebookProfileInfos]; 

    } 
    }]; 
} 

-(void)getFacebookProfileInfos { 
NSDictionary *parameters = @ {@"fields": @"id, name, first_name, last_name, picture.type(large), email"}; 
if ([FBSDKAccessToken currentAccessToken]) { 
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     if (!error) { 
      NSLog(@"fetched user:%@", result); 
     } 
    }]; 
} 

}

obtendrá toda la información del resultado.

Cuestiones relacionadas