使用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文章中的蓝色文字就是步骤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。