Publicar una foto en la pared del usuario con Facebook iOS SDK

Intento subir una foto de la cámara al muro de Facebook de un usuario. No estoy del todo seguro de cuál es la estrategia correcta, pero al leerla parece que lo que hay que hacer es subir la foto a un álbum, y luego alguien publica en la pared un enlace a ese álbum / foto. Idealmente, esto implicaría el diálogo, pero por lo que puedo ver, eso no es posible.

Logré subir una foto a un álbum y obtener una identificación para esa foto, pero no estoy seguro de qué hacer después de eso.

¿Alguien puede proporcionar algún código directo para lograr esto?

Pregunta extra: ¿es posible publicar la foto en el muro de la aplicación también (o en su lugar)?

Editar: Graph API es preferible, pero todo lo que funciona en esta etapa es bueno.

Está más claro lo que desea hacer: publicar una foto en FB y garantizar que una publicación se publique en la pared / transmisión del usuario.

Desafortunadamente, hay algunas cosas en el camino.

La API de FB Graph parece que solo le permite publicar CUALQUIER imagen en un álbum, o publicar directamente en la pared, vinculándola a una imagen ya existente en algún lugar de la web. En el primer caso, probablemente se realice una publicación en la transmisión, pero FB parece consolidar varias publicaciones de alguna manera para evitar que la transmisión del usuario sea bombardeada. El mecanismo para esto no está documentado en ningún lugar que pueda ver.

En el segundo caso, podría pensar que podría salirse con la publicación de un álbum, y luego publicar explícitamente un enlace al álbum. Puede agregar un parámetro a la publicación del álbum original, “no_story” con un valor de 1, y suprimir la publicación en el muro que podría realizarse mientras se prepara para crear una publicación explícita. Sin embargo, FB no tendrá la URL de origen para una imagen recién publicada por un tiempo, Y parece que no le gustan las URL que incluyen su propia red de entrega de contenido y devuelve un error. Puede pensar simplemente poner la actualización de estado en la transmisión, hablando de la publicación. Sin embargo, Graph API también está limitada a 25 publicaciones de feed directo por día por aplicación, para evitar el correo no deseado.

Una solución sería publicar algo como Flickr, obtener la URL de la imagen y luego publicarla en la pared. La solución preferida de FB parece ser el uso de los cuadros de diálogo FB que forman parte del conjunto de herramientas móviles, esencialmente pequeñas páginas web muy parecidas a la pantalla OAuth.

Personalmente, planeo simplemente publicar en el álbum como arriba, y vivir con la idea de FB de cómo se debe notificar al usuario. Curioso cómo eliges proceder.

Hice esto en tres pasos

1 foto de publicación en álbum (devuelve ID de imagen)

2 use imageID para solicitar metadatos para imageID

3 use el campo ‘enlace’ (no el campo ‘fuente’) como un enlace a la imagen en una publicación en el muro del usuario

La desventaja es que ahora hay dos publicaciones en la pared, una para la imagen y otra para la publicación real. Aún no he descubierto cómo publicar una imagen en un álbum, sin que también aparezca una publicación en la pared (idealmente sería la segunda publicación que aparece)

Paso 1:

- (void) postImageToFacebook { appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate]; currentAPICall = kAPIGraphUserPhotosPost; UIImage *imgSource = {insert your image here}; NSString *strMessage = @"This is the photo caption"; NSMutableDictionary* photosParams = [NSMutableDictionary dictionaryWithObjectsAndKeys: imgSource,@"source", strMessage,@"message", nil]; [appDelegate.facebook requestWithGraphPath:@"me/photos" andParams:photosParams andHttpMethod:@"POST" andDelegate:self]; // after image is posted, get URL for image and then start feed dialog // this is done from FBRequestDelegate method } 

Paso 2 (kAPIGraphUserPhotosPost) y paso 3 (kAPIGraphPhotoData):

 - (void)request:(FBRequest *)request didLoad:(id)result { if ([result isKindOfClass:[NSArray class]] && ([result count] > 0)) { result = [result objectAtIndex:0]; } switch (currentAPICall) { case kAPIGraphPhotoData: // step 3 { // Facebook doesn't allow linking to images on fbcdn.net. So for now use default thumb stored on Picasa NSString *thumbURL = kDefaultThumbURL; NSString *imageLink = [NSString stringWithFormat:[result objectForKey:@"link"]]; currentAPICall = kDialogFeedUser; appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate]; NSMutableDictionary* dialogParams = [NSMutableDictionary dictionaryWithObjectsAndKeys: kAppId, @"app_id", imageLink, @"link", thumbURL, @"picture", @"Just Played Wizard etc etc", @"name", nil]; [appDelegate.facebook dialog:@"feed" andParams:dialogParams andDelegate:self]; break; } case kAPIGraphUserPhotosPost: // step 2 { NSString *imageID = [NSString stringWithFormat:[result objectForKey:@"id"]]; NSLog(@"id of uploaded screen image %@",imageID); currentAPICall = kAPIGraphPhotoData; appDelegate = (Scorecard4AppDelegate *)[[UIApplication sharedApplication] delegate]; [appDelegate.facebook requestWithGraphPath:imageID andDelegate:self]; break; } } } 

Modifiqué el código para mostrar solo las cosas de Facebook condensadas. Si desea verificar si la publicación es exitosa, querrá algo como esto:

 - (void)dialogDidComplete:(FBDialog *)dialog { switch (currentAPICall) { case kDialogFeedUser: { NSLog(@"Feed published successfully."); break; } } } 

publicación de Facebook

El texto azul en la publicación de Facebook es lo que coloque en el parámetro “nombre” en el Paso 3. Al hacer clic en el texto azul en Facebook, lo llevará a la foto publicada en el Paso 1, en un álbum en Facebook (Facebook crea un álbum predeterminado para su aplicación si no especifica un álbum). En el caso de mi aplicación, es la imagen de tamaño completo de la tabla de puntuación (pero podría ser cualquier imagen, por ejemplo, desde la cámara). Lamentablemente no pude encontrar la forma de convertir la imagen del pulgar en un enlace en vivo, pero no es muy legible, por lo que un pulgar predeterminado funciona en mi caso. La parte en la publicación de Facebook (en letra negra) que dice “Primer juego del año …” es ingresada por el usuario.

No estoy seguro de qué parte no funciona para usted, ya que está publicando y recibiendo una identificación, pero esto es lo que hice de manera rápida y sucia, en caso de que alguien llegue aquí a través de Google.

Esta es una función HTTP POST, y los datos binarios del archivo aumentan como mime multiparte.

Soy un gran admirador de la biblioteca ASIHTTPRequest disponible aquí .

** ACTUALIZACIÓN: 22/10/2012 ** – AFNetworking ha reemplazado ASIHTTPRequest en mi código en los últimos meses. Disponible en GitHub aquí

Los documentos de Facebook son confusos, en parte porque son incompletos y en parte porque pueden estar equivocados. Probablemente te desharás un poco averiguando qué valor de publicación debes establecer para un título o algo, pero esta receta pone una foto en un álbum, y eso va al feed.

Aún necesita configurar las cosas de Facebook OAuth de la manera más básica: sucedió que hice eso en el delegado de la aplicación, así que cogí el objeto de Facebook desde allí para obtener mi token de acceso. Me aseguré de pedir el permiso “publish_stream” cuando me autenticé, así:

 [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:self]; 

Esto creará o agregará un álbum llamado “YOUR_APP_NAME Photos” y aparecerá en el feed del usuario. Puede colocarlo en cualquier álbum, incluido el álbum “Muro”, obteniendo la ID de ese álbum y cambiando la URL a http://graph.facebook.com/THE_ID_OF_THE_ALBUM/photos .

Este es el método básico:

 -(void) postImageToFB:(UIImage *) image { NSData* imageData = UIImageJPEGRepresentation(image, 90); Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook ]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"https://graph.facebook.com/me/photos"]]; [request addPostValue:[fb accessToken] forKey:@"access_token"]; [request addPostValue:@"image message" forKey:@"message"]; [request addData:imageData forKey:@"source"]; [request setDelegate:self]; [request startAsynchronous]; } 

El uso de la biblioteca iOS proporcionada por Facebook se ve así:

 -(void) postImageToFB:(UIImage *) image { NSData* imageData = UIImageJPEGRepresentation(image, 90); Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook ]; NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:[fb accessToken],@"access_token", @"message text", @"message", imageData, @"source", nil]; [fb requestWithGraphPath:@"me/photos" andParams:params andHttpMethod:@"POST" andDelegate:self]; } 

Usando Facebook SDK 3.0:

  - (void) postPhotoThenOpenGraphAction {
     FBRequestConnection * connection = [[FBRequestConnection alloc] init];

     // La primera solicitud carga la foto.
     FBRequest * request1 = [FBRequest 
         requestForUploadPhoto: self.selectedPhoto];
     [conexión addRequest: request1
         FinalizadorHandler:
         ^ (Conexión FBRequestConnection *, resultado de id., Error NSError *) {
             if (! error) {
             }
         }
             batchEntryName: @ "photopost"
     ];

     // Segunda solicitud recupera información de la foto para el recién creado 
     // foto para que podamos tomar su fuente.
     FBRequest * request2 = [FBRequest 
         requestForGraphPath: @ "{result = photopost: $. id}"];
     [conexión addRequest: request2
          FinalizadorHandler:
         ^ (Conexión FBRequestConnection *, resultado de id., Error NSError *) {
             if (! error &&
                 resultado) {
                 NSString * source = [result objectForKey: @ "source"];
                 [self postOpenGraphActionWithPhotoURL: source];
             }
         }
     ];

     [inicio de la conexión];
 }

Siguen esta publicación con una publicación de acción OpenGraph ( [self postOpenGraphActionWithPhotoURL:source]; ), pero si solo quieres la imagen en el muro del usuario, no la necesitarás.

Más información: https://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/publish-open-graph-story/#step7

Yay !, FB SDK 3.0 rocas! No más AppDelegate.facebook 🙂

Busqué por todas partes una solución que funcionara con las últimas API, hasta que me encontré con esto:

http://xcodenoobies.blogspot.co.uk/2012/09/how-to-upload-photo-and-update-status.html

Con mucho, la solución más clara que he encontrado, simple y que funciona con la última API.