我正在尝试将照片从相机上传到用户的Facebook墙。我不完全确定正确的策略是什么,但是通过阅读它似乎要做的是将照片上传到相册,然后有人在墙上张贴了该相册/照片的链接。理想情况下,这将涉及对话,但从我可以说,这是不可能的。
我已设法将照片上传到相册,然后取回该照片的ID,但我不确定在此之后该怎么做。
任何人都可以提供一些简单的代码来实现这一目标吗?
奖金问题:是否可以将照片发布到应用程序墙(或者代替)?
编辑:最好使用图谱API,但在此阶段运行的任何内容都很好。
答案 0 :(得分:18)
我分三步完成了这个步骤
1张照片到相册(返回imageID)
2使用imageID来请求imageID的元数据
3使用'link'字段(不是'source'字段)作为用户墙上帖子中图像的链接
缺点是墙上有两个帖子,一个用于图像,一个用于实际帖子。我还没有弄清楚如何将照片发布到相册中,而且还没有出现墙贴(理想情况下它只是出现的第2个帖子)
第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内容。如果你想检查帖子是否成功,你会想要这样的东西:
- (void)dialogDidComplete:(FBDialog *)dialog {
switch (currentAPICall) {
case kDialogFeedUser:
{
NSLog(@"Feed published successfully.");
break;
}
}
}
Facebook帖子中的蓝色文字是您在步骤3中的“名称”参数中添加的任何内容。点击Facebook中的蓝色文字将带您进入步骤1中发布的照片,在Facebook的一张专辑中(Facebook创建)如果您未指定相册,则为您的应用设置默认相册。在我的应用程序的情况下,它是记分卡的全尺寸图像(但可以是任何图像,例如来自相机)。不幸的是,我无法找到一种方法使拇指图像成为一个实时链接,但它不是非常易读,所以默认拇指在我的情况下工作。 Facebook帖子(黑色字体)中标有“今年第一场比赛......”的部分由用户输入。
答案 1 :(得分:16)
您希望做的更清楚 - 将照片发布到FB,并保证帖子会在用户的墙上/流中播放。
不幸的是,有一些事情在路上。
FB Graph API似乎只允许您将图片发布到相册,或直接发布到墙上,链接到网络上已存在的图片。在第一种情况下,可能会在流中创建一个帖子,但FB似乎以某种方式合并多个帖子,以防止用户的流被轰炸。在我能看到的任何地方都没有记录这种机制。
在第二种情况下,您可能认为可以通过发布到相册,然后明确地发布到相册的链接。您可以将参数添加到原始相册帖子“no_story”,其值为1,并在您准备制作明确的帖子时抑制可能发布的墙贴。但是,FB暂时不会为新发布的图像提供源URL,并且它似乎不喜欢包含其自己的内容传送网络的URL,从而返回错误。您可以考虑简单地将状态更新放在流中,讨论帖子,但是,图谱API也限制为每个应用每天25个这样的直接馈送帖子,以防止发送垃圾邮件。
一种解决方案是发布到Flickr之类的内容,获取图像的URL,然后发布到墙上。 FB的首选解决方案似乎是使用属于移动工具包的FB对话框 - 实际上很少有像OAuth屏幕那样的网页。
就我个人而言,我打算只是按照上面的方式发布到相册,并与FB一起了解如何通知用户的想法。好奇你如何选择继续。
答案 2 :(得分:9)
我不确定哪个部分不适合你,因为你正在发布并获得一个ID,但这是我以快速而肮脏的方式做的事情,以防有人通过Google到达这里。
这是一个HTTP POST功能,文件的二进制数据以多部分mime的形式上升。
我是ASIHTTPRequest库的忠实粉丝here。
**更新:2012年10月22日** - 在过去的几个月里,AFNetworking已在我的代码中替换了ASIHTTPRequest。可在GitHub here
上找到 Facebook的文档令人困惑,部分原因是它们不完整,部分原因是它们可能是错的。你可能会撕掉一些头发,弄清楚要为标题或其他东西设置的确切值,但这个食谱会将一张照片放入一张专辑,然后进入Feed。你仍然需要以基本的方式设置Facebook OAuth的东西 - 我碰巧在app委托中这样做,所以我从那里抓取Facebook对象来获取我的访问令牌。我确认在我进行身份验证时要求“publish_stream”权限,如下所示:
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:self];
这将创建或添加到名为“YOUR_APP_NAME照片”的相册,并将显示在用户的Feed中。您可以通过获取该相册的ID并将网址更改为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];
}
答案 3 :(得分:3)
使用Facebook SDK 3.0:
- (void)postPhotoThenOpenGraphAction { FBRequestConnection *connection = [[FBRequestConnection alloc] init]; // First request uploads the photo. FBRequest *request1 = [FBRequest requestForUploadPhoto:self.selectedPhoto]; [connection addRequest:request1 completionHandler: ^(FBRequestConnection *connection, id result, NSError *error) { if (!error) { } } batchEntryName:@"photopost" ]; // Second request retrieves photo information for just-created // photo so we can grab its source. FBRequest *request2 = [FBRequest requestForGraphPath:@"{result=photopost:$.id}"]; [connection addRequest:request2 completionHandler: ^(FBRequestConnection *connection, id result, NSError *error) { if (!error && result) { NSString *source = [result objectForKey:@"source"]; [self postOpenGraphActionWithPhotoURL:source]; } } ]; [connection start]; }
他们使用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:)
答案 4 :(得分:2)
我搜索了最新API的解决方案,直到我遇到了这个:
http://xcodenoobies.blogspot.co.uk/2012/09/how-to-upload-photo-and-update-status.html
到目前为止,我遇到过最简单的解决方案,简单并且可以使用最新的API。