使用Facebook iOS SDK在用户墙上发布照片

时间:2011-07-15 02:38:51

标签: iphone objective-c facebook

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

我已设法将照片上传到相册,然后取回该照片的ID,但我不确定在此之后该怎么做。

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

奖金问题:是否可以将照片发布到应用程序墙(或者代替)?

编辑:最好使用图谱API,但在此阶段运行的任何内容都很好。

5 个答案:

答案 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 post

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。