ser - Consultar los datos del usuario de Facebook a través del nuevo marco social iOS6
que pasa si veo mucho un perfil de facebook (6)
Intento consultar información sobre un usuario utilizando la nueva API de integración de Facebook de iOS 6. Este es el código que estoy usando, que es básicamente idéntico a lo que demostraron en la WWDC:
{
NSDictionary *parameters = @{};
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:url
parameters:parameters];
request.account = self.account;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"Facebook request received, status code %d", urlResponse.statusCode);
NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"Response data: %@", response);
dispatch_async(dispatch_get_main_queue(), ^{
});
}];
}
El problema es que recibo el código de error 2500 de Facebook: "Se debe usar un token de acceso activo para consultar información sobre el usuario actual". Si cambio la consulta a https://graph.facebook.com/[facebook id], entonces funciona bien. Supongo que el problema es que iOS está pasando el token de acceso de la aplicación en lugar del token de acceso del usuario al enviar la solicitud a través de requestForServiceType. Simplemente no sé cómo solucionarlo. Obviamente, anticipar y codificar las identificaciones de Facebook de mis usuarios no es una opción. ¿Alguna sugerencia?
agrega tu token de acceso activo en parámetros como
NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"PUT_ACCESS_TOKEN_HERE" forKey:@"access_token"];
Tuve el mismo mensaje de error, lo arreglé guardando mi cuenta después de renovar la credencial.
Me enfrenté con el mismo problema y encontré la solución alternativa:
NSString *uid = [NSString stringWithFormat:@"%@", [[self.account valueForKey:@"properties"] valueForKey:@"uid"]] ;
NSURL *url = [NSURL URLWithString:[@"https://graph.facebook.com" stringByAppendingPathComponent:uid]];
Asegúrese de que su cuenta (ACAcuenta *) facebookAccount (o en su caso autocuenta) sea sólida y la configure correctamente al obtener permisos.
OK aquí es cómo hago esta integración con iOS 6 y obtengo lo que quiero de Facebook:
En AppDelegate hago esto:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [FBSession.activeSession handleOpenURL:url];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[FBSession.activeSession handleDidBecomeActive];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
[FBSession.activeSession close];
}
y en mi ViewController, donde quiero recuperar información sobre mí o mis amigos, hago esto (NOTA: esta es una prueba, ¡así que son muchos los permisos!):
NSArray *permissions =
[NSArray arrayWithObjects:@"email", @"user_location",
@"user_birthday",
@"user_likes", @"user_interests",@"friends_interests",@"friends_birthday",@"friends_location",@"friends_hometown",@"friends_photos",@"friends_status",
@"friends_about_me", @"friends_birthday", @"friends_hometown", @"friends_interests", @"friends_likes", @"friends_location", nil];
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
/* handle success + failure in block */
if (status) {
NSLog(@"Facebook Read Permission is successful!");
[self presentPostOptions];
// [self presentPostOptions];
}
}];
Luego en "presentPostOptions" hago esto (en este ejemplo, intento recuperar algo de mi amigo):
- (void)presentPostOptions
{
[[FBRequest requestForMyFriends] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error)
{
if (!error) {
NSArray *data = [user objectForKey:@"data"];
NSLog(@"%d", [data count]);
for (FBGraphObject<FBGraphUser> *friend in data) {
NSLog(@"%@", [friend first_name]);
NSLog(@"%@", [friend last_name]);
NSLog(@"%@", [friend id]);
//make sure you have FBProfilePictureView outlet in your view
//otherwise skip the profile picture!
self.fbProfilePic.profileID = @"you''r friend''s profile.id";
}
}
else
{
NSLog(@"error");
// [self didFailWithError:error];
}
}];
No sé qué más quieres hacer porque en tu pregunta simplemente intentaste establecer una conexión, pero de esta manera puedes hacer lo que quieras mientras estás integrado en iOS 6.
Una cosa más, asegúrese de la configuración de su aplicación en Facebook y las configuraciones de allí como habilitar su aplicación para iOS y la ID para iPhone / iPad. También el FacebookAppID en tu lista.
Avísame si te funciona,
EDITAR: por cierto mi SDK de Facebook es 3.1.1.
La respuesta es simple
en viewDidLoad () use:
accountStore= [[ACAccountStore alloc]init];
facebookAccountType= [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options= @{
ACFacebookAudienceKey: ACFacebookAudienceEveryone,
ACFacebookAppIdKey: @"<YOUR FACEBOOK APP ID>",
ACFacebookPermissionsKey: @[@"public_profile"]
};
[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) {
if (granted) {
NSLog(@"Permission has been granted to the app");
NSArray *accounts= [accountStore accountsWithAccountType:facebookAccountType];
facebookAccount= [accounts firstObject];
[self performSelectorOnMainThread:@selector(facebookProfile) withObject:nil waitUntilDone:NO];
} else {
NSLog(@"Permission denied to the app");
}
}];
Y la función- (void) facebookProfile
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];
Observe que los parámetros que necesita se agregan como diccionario. Consulte a continuación la lista completa https://developers.facebook.com/docs/graph-api/reference/user
NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:@"picture,id,name",@"fields", nil];
SLRequest *profileInfoRequest= [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:param];
profileInfoRequest.account= facebookAccount;
[profileInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"Facebook status code is : %ld", (long)[urlResponse statusCode]);
if ([urlResponse statusCode]==200) {
NSDictionary *dictionaryData= [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];
} else {
}
}];
}