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

Ben*_*ams 25 iphone facebook objective-c

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

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

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

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

编辑:图形API是首选,但在此阶段工作的任何东西都是好的.

Eri*_*uza 18

我分三步完成了这个

1张图片到相册(返回imageID)

2使用imageID为imageID请求元数据

3使用"链接"字段(而不是"源"字段)作为链接到用户墙上的帖子中的图像

缺点是墙上有两个帖子,一个用于图像,一个用于实际帖子.我还没弄明白如何将照片发布到相册中,而且还没有出现墙贴(理想情况下它只是出现的第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
}
Run Code Online (Sandbox Code Playgroud)

第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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我修改了代码,只显示了浓缩的Facebook内容.如果你想检查帖子是否成功,你会想要这样的东西:

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

facebook发布

Facebook帖子中的蓝色文本是您在步骤3中的"名称"参数中添加的任何内容.点击Facebook中的蓝色文本将带您进入步骤1中发布的照片​​,在Facebook的相册中(Facebook创建默认相册如果您没有指定相册,请为您的应用程序添加).在我的应用程序的情况下,它是记分卡的全尺寸图像(但可以是任何图像,例如来自相机).不幸的是,我无法找到一种方法使拇指图像成为一个实时链接,但它不是非常易读,所以默认拇指在我的情况下工作.是说,在Facebook发布的部分(黑色字体)"今年的第一场比赛......"由用户输入.


gif*_*iff 16

你想做什么更清楚 - 将照片发布到FB,并保证帖子在用户的墙/流上.

不幸的是,有一些事情在路上.

FB Graph API似乎只允许您将图片发布到相册,或直接发布到墙上,链接到网络上已存在的图片.在第一种情况下,可能会在流中创建一个帖子,但FB似乎以某种方式合并多个帖子,以防止用户的流被轰炸.在我能看到的任何地方都没有记录这种机制.

在第二种情况下,您可能认为可以通过发布到相册,然后明确地发布到相册的链接.您可以将参数添加到原始相册帖子"no_story",其值为1,并在您准备制作明确的帖子时抑制可能发布的墙贴.但是,FB暂时不会为新发布的图像提供源URL,并且它似乎不喜欢包含其自己的内容传送网络的URL,从而返回错误.您可能会想到简单地将状态更新放在流中,讨论帖子,但是,图谱API也限制为每个应用每天25个这样的直接馈送帖子,以防止发送垃圾邮件.

一种解决方案是发布到Flickr之类的东西,获取图像的URL,然后发布到墙上.FB的首选解决方案似乎是使用属于移动工具包的FB对话框 - 实际上很少有像OAuth屏幕那样的网页.

就个人而言,我打算简单地发布到上面的专辑,并与FB的想法如何通知用户.好奇你如何选择继续.


gif*_*iff 9

我不确定哪个部分不适合你,因为你正在发布并获得一个ID,但这是我快速而肮脏的方式,以防有人通过谷歌来到这里.

这是一个HTTP POST函数,该文件的二进制数据以多部分mime的形式上升.

我提供的ASIHTTPRequest库的大风扇在这里.

**更新:2012年10月22日** - 在过去的几个月里,AFNetworking已经在我的代码中取代了ASIHTTPRequest.可在GitHub上找到

Facebook的文档令人困惑,部分原因是它们不完整,部分原因是它们可能是错误的.你可能会撕掉一些头发,确定要为标题或其他东西设置的确切值,但这个食谱会将照片放入相册中,然后进入相册.

你仍然需要以基本的方式设置Facebook OAuth的东西 - 我碰巧在app委托中这样做,所以我从那里抓取Facebook对象来获取我的访问令牌.我确认在我进行身份验证时要求"publish_stream"权限,如下所示:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:self];
Run Code Online (Sandbox Code Playgroud)

这将创建或添加到名为"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];  
}
Run Code Online (Sandbox Code Playgroud)

使用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];


}
Run Code Online (Sandbox Code Playgroud)