使用Facebook iOS SDK在用户的墙上张贴照片

我试图从相机上传照片到用户的Facebook墙上。 我不完全确定正确的策略是什么,但是从阅读的angular度来看,似乎要做的是将照片上传到相册,然后有人在墙上张贴该相册/照片的链接。 理想情况下,这将涉及对话,但从我可以告诉这是不可能的。

我已经设法上传一张照片到一个相册,并获得该照片的ID,但我不知道该怎么做之后。

任何人都可以提供一些简单的代码来实现这一目标?

奖金问题:是否有可能将照片发布到应用程序墙上(或改为)?

编辑:graphicsAPI是可取的,但在这个阶段的任何工作是好的。

你想要做什么更清晰 – 向FB张贴照片,并保证在用户的墙上/videostream上发布post。

不幸的是,有一些事情正在进行中。

FBgraphicsAPI似乎只允许您张贴照片到相册,或直接张贴到墙上,链接到networking上已经存在的图片。 在第一种情况下,可能会在stream中创build一个职位,但是FB似乎以某种方式整合了多个职位,以防止用户的stream被轰炸。 这个机制没有logging在任何我能看到的地方。

在第二种情况下,您可能会认为您可以放弃发布到相册,然后明确发布相册的链接。 您可以将一个参数添加到原始专辑文章“no_story”,其值为1,并且在准备制作一个明确的专辑时可以取消可能制作的墙贴。 但是,FB将暂时没有新发布的图像的源URL,并且它看起来并不喜欢包含其自己的内容交付networking的URL,并返回错误。 您可能会考虑简单地在stream中添加状态更新,讨论post。但是,Graph API也被限制在每个应用每天25个这样的直接post,以防止垃圾邮件。

一个解决scheme是发布到像Flickr,获取图像的URL,然后张贴到墙上。 FB的首选解决scheme似乎是使用作为移动工具包一部分的FB对话框 – 基本上与OAuth屏幕非常类似的网页。

就个人而言,我打算只是在上面张贴专辑,并与FB的如何通知用户的想法。 好奇你如何select继续。

我通过三个步骤做到了这一点

1发布图片到相册(返回imageID)

2使用imageID来请求imageID的元数据

3使用“链接”字段(而不是“源”字段)作为到用户墙的post中的图像的链接

缺点是现在有两个墙贴,一个是形象,一个是实际的贴子。 我还没有想出如何将照片张贴到相册,没有出现一个墙上的post(理想情况下,这将是第二个职位出现)

步骤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 } 

第2步(kAPIGraphUserPhotosPost)&第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; } } } 

我已经修改了代码,以显示Facebook的东西浓缩。 如果你想检查post是否成功,你会想要这样的东西:

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

Facebook的帖子

Facebook文章中的蓝色文字就是步骤3中“name”参数中的任何内容。点击Facebook中的蓝色文字,即可将您带到Facebook中的相册中的第1步中发布的照片​​上(Facebook创build一个默认相册为您的应用程序,如果你不指定一个专辑)。 在我的应用程序的情况下,它是记分卡的全尺寸图像(但可以是任何图像,例如从相机)。 不幸的是,我无法弄清楚一个方法,使拇指图像的实时链接,但它不是很可读,所以默认的拇指在我的情况下工作。 用户inputFacebookpost中的部分(黑色字体),表示“年度第一场比赛…”。

我不确定哪个部分不适合你,因为你正在发布和获取一个ID,但这是我做了一个快速和肮脏的方式,以防有人通过谷歌到达这里。

这是一个HTTP POST函数,文件的二进制数据会作为多部分MIME。

我是这里提供的ASIHTTPRequest库的忠实粉丝。

**更新:2012年10月22日** – 在过去几个月里,AFNetworking在我的代码中取代了ASIHTTPRequest。 在这里可以在GitHub上find

Facebook的文档令人困惑,部分是因为它们不完整,部分是因为它们可能是错的。 你可能会掏出一些头发,搞清楚为什么要设置一个标题什么后值,但这个配方把一张照片放入一个相册,并进入饲料。

您仍然需要以基本的方式设置Facebook OAuth的东西 – 我碰巧在应用程序委托中这样做,所以我从那里抓取Facebook对象来获取我的访问令牌。 当我通过身份validation时,我确保要求获得“publish_stream”权限,如下所示:

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

这会创build或添加一个名为“YOUR_APP_NAME照片”的相册,并会显示在用户的Feed中。 您可以通过获取该专辑的ID并将URL更改为http://graph.facebook.com/THE_ID_OF_THE_ALBUM/photos ,将其放入任何专辑中,包括“Wall”专辑。

这里是基本的方法:

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

使用Facebook提供的iOS库如下所示:

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

使用Facebook SDK 3.0:

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

     //首先请求上传照片。
     FBRequest * request1 = [FBRequest 
         requestForUploadPhoto:self.selectedPhoto];
     [连接addRequest:request1
         completionHandler:
         ^(FBRequestConnection *连接,id结果,NSError *错误){
            如果(!错误){
             }
         }
             batchEntryName:@ “photopost”
     ]。

     //第二个请求获取刚刚创build的照片信息 
     / /照片,所以我们可以抓住它的来源。
     FBRequest * request2 = [FBRequest 
         requestForGraphPath:@ “{结果= photopost:$ ID}”];
     [连接addRequest:request2
          completionHandler:
         ^(FBRequestConnection *连接,id结果,NSError *错误){
            如果(!error &&
                结果){
                 NSString * source = [result objectForKey:@“source”];
                 [self postOpenGraphActionWithPhotoURL:source];
             }
         }
     ]。

     [连接开始];
 }

他们遵循这个职位与OpenGraph行动发布( [self postOpenGraphActionWithPhotoURL:source]; ),但如果你只是想在用户的墙上的图像,你不会需要的。

更多信息: https : //developers.facebook.com/docs/tutorials/ios-sdk-tutorial/publish-open-graph-story/#step7

Yay!,FB SDK 3.0岩石! 没有更多的AppDelegate.facebook 🙂

我search了很多关于最新API的解决scheme,直到我遇到这个问题:

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

到目前为止,我遇到的最简单的解决scheme就是使用最新的API。