2011-07-09 29 views
10

Agradecería cualquier sugerencia sobre cómo solucionar un problema que estoy teniendo al publicar una imagen en Facebook.facebook ios sdk - problema al publicar fotos usando UIImage

El siguiente código funciona igual de lo que cabe esperar:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
       @"http://myserver/img.png", @"picture", 
       @"My Testing", @"name", 
       @"Enter some text...", @"message", 
       nil]; 

[appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self]; 

Sin embargo, lo que realmente quiero usar una imagen que capture de mi cámara. Configuré el código para hacer eso antes en mi aplicación y coloqué la imagen en la pantalla. Por lo tanto, he tratado de hacer esto:

CGRect contextRect = CGRectMake(0, 0, 320, 436); 
UIGraphicsBeginImageContextWithOptions(contextRect.size, YES, 1); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

He probado este código y newImage es un UIImage válida que puedo colocar y manipular al igual que yo esperaría. Sin embargo, cuando intento de integrarlo en el diálogo de Facebook de la siguiente manera:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
       newImage, @"picture", 
       @"My Testing", @"name", 
       @"Enter some text...", @"message", 
       nil]; 

[appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self]; 

consigo estos dos mensajes ridículos en la consola: - [longitud UIImage]: Selector no reconocido enviado a la instancia 0x1c9420 CoreAnimation: ignorando excepción : - [UIImage length]: selector no reconocido enviado a la instancia 0x1c9420

Por lo tanto, como prueba, pensé en intentar importar una imagen en mi proyecto y acceder a ella directamente. Esta es la imagen exacta que mencioné en línea en el primer ejemplo, así que sé que debería funcionar. Pero incluso cuando pruebo esto:

UIImage *newImage = [UIImage imageNamed:@"BaB.png"]; 

Aparece el mismo mensaje de error que el anterior.

Veo en la documentación de Facebook que se supone que la tecla "imagen" usa la URL para una imagen. Pero he visto algunos ejemplos en línea que indican que las personas están usando un UIImage en lugar de solo una URL.

Claramente, estoy haciendo algo mal, pero no tengo idea de lo que podría ser.

Estaría muy agradecido por cualquier información sobre cómo proceder.

Respuesta

15

Una respuesta resumida que describe el proceso de ... punto clave es incluir la señal_acceso en las llamadas gráfico desde el facebook-ios-SDK no lo hace de forma automática:

1) actualizar a la última facebook -ios-sdk.
2) Crear una instancia con la identificación de la aplicación.



     self.facebook = [[Facebook alloc] initWithAppId:kApplicationFBID]; 

3) Autorizar la aplicación incluyendo publish_stream



    NSArray * neededPermissions = [[[NSArray alloc] initWithObjects:@"user_about_me", @"publish_stream", @"user_photos", nil] autorelease]; 
    [facebook authorize:neededPermissions delegate:appDelegate]; 

4) Asegurarse de capturas fBDidLogin aplicación de delegado y almacena el token de acceso & de caducidad en valores predeterminados del usuario (para la optimización posterior de proceso de inicio de sesión).



    -(void)fbDidLogin { 
     DebugLog(@"New Access Token: %@", [facebook accessToken]); 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
     [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
     [defaults synchronize]; 
    } 

5) Confirmar token de acceso válida (no nula y no caducado) ... de lo contrario re autorizar aplicación por arriba.
6) Capture la imagen en UIImage & llamada esta notando la adición crítica de access_token. Esto creará automáticamente un álbum para su aplicación y colocará la imagen allí y la publicará en la pared según mi prueba.

-(void)postImageToAlbum:(UIImage *)image { 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    image, @"source", 
    @"caption desc", @"message",    
    nil]; 
    [facebook requestWithGraphPath:[NSString stringWithFormat:@"/me/photos?access_token=%@", self.facebook.accessToken] 
    andParams:params andHttpMethod:@"POST" andDelegate:self]; 
} 

7) Verificar si la ID del resultado en el método FBRequestDelegate



    -(void)request:(FBRequest *)request didLoad:(id)result { 
     NSLog(@"Request didLoad: %@ ", [request url ]); 
     if ([result isKindOfClass:[NSArray class]]) { 
      result = [result objectAtIndex:0]; 
     } 
     if ([result isKindOfClass:[NSDictionary class]]){ 

     } 
     if ([result isKindOfClass:[NSData class]]) { 
     } 
     NSLog(@"request returns %@",result); 
    } 

8) NO USE una cuenta de usuario de prueba para las pruebas ... Actualmente se auth la cuenta de prueba y proporcionar un token de acceso pero cuando intenta utilizar la API de gráficos, devolverá errores inesperados. Puede estar bien si está utilizando la versión web o la configuración de la aplicación nativa en dev.facebook.com, ya que supuestamente puede crear usuarios de prueba y asociarlos con la aplicación, pero no lo he intentado.

¡Buena suerte!

+0

Esto es genial. Agradezco su ayuda –

+1

En Facebook.m, en o alrededor de la línea 166, el SDK agrega access_token a los parámetros que se pasaron, lo que hace que el desarrollador pase el token de acceso, ya que es redundante. ya sea un param o una parte de la URL. – mahboudz

Cuestiones relacionadas