【问题标题】:Post photo on user's wall using Facebook iOS SDK使用 Facebook iOS SDK 在用户的墙上发布照片
【发布时间】:2011-10-05 20:08:16
【问题描述】:

我正在尝试将相机中的照片上传到用户的 Facebook 墙上。我不完全确定正确的策略是什么,但从周围阅读看来,要做的事情是将照片上传到相册,然后有人在墙上发布指向该相册/照片的链接。理想情况下,这将涉及对话,但据我所知,这是不可能的。

我已设法将照片上传到相册,并取回了该照片的 ID,但我不知道之后该怎么做。

谁能提供一些简单的代码来实现这一点?

额外问题:是否可以将照片也(或替代)发布到应用程序墙上?

编辑:Graph API 更可取,但在这个阶段任何工作都很好。

【问题讨论】:

标签: iphone objective-c facebook


【解决方案1】:

我分三步完成了这个

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

2 使用 imageID 请求 imageID 的元数据

3 使用“链接”字段(而不是“来源”字段)作为指向用户墙上帖子中图片的链接

缺点是现在墙上有两个帖子,一个是图片,一个是实际帖子。我还没有弄清楚如何将图片发布到相册,而不会出现墙贴(理想情况下它只是出现的第二个帖子)

第 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 帖子(黑色字体)中写着“年度第一场比赛...”的部分由用户输入。

【讨论】:

  • 你可以添加结果方法吗?
  • 哦,非常感谢!我想知道您是否设法将图片添加到用户的默认“Wall Photos”相册中;搜索了几个例子,但我还没有找到任何东西......
  • 似乎使用 [result objectForKey:@"picture"] 作为 thumbURL 正在工作。
  • 谢谢你亲爱的@EricD'Souza。它对我来说非常好。
  • 您好,我正在尝试做同样的事情,但您的代码有问题。获取 kAPIGraphUserPhotosPost 和 kAPIGraphPhotoData 错误。我是否需要包含其他内容或将其设置在某处?提前致谢!
【解决方案2】:

更清楚您想要做什么 - 将照片发布到 FB,并保证帖子会出现在用户的墙上/信息流中。

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

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

在第二种情况下,您可能认为您可以通过发布到相册,然后明确发布指向该相册的链接而侥幸。您可以在原始专辑帖子中添加一个参数“no_story”,值为 1,并在您准备制作显式帖子时抑制可能发布的墙帖。但是,FB 暂时不会有新发布的图片的源 URL,而且,它似乎不喜欢包含自己的内容交付网络的 URL,返回错误。您可能会认为只是将状态更新放在流中,谈论帖子,但是,Graph API 也限制为每个应用每天 25 个此类直接提要帖子,以防止垃圾邮件。

一种解决方案是发布到 Flickr 之类的网站,获取图片的 URL,然后发布到墙上。 FB 的首选解决方案似乎是使用作为移动工具包一部分的 FB 对话框——本质上是非常类似于 OAuth 屏幕的小网页。

就个人而言,我打算像上面一样简单地发布到相册,并接受 FB 关于如何通知用户的想法。好奇你选择如何继续。

【讨论】:

  • 我想我得出了相同的结论,即发布照片并将其显示为墙贴并不容易,这令人惊讶。选项是使用外部照片托管服务,或者只是接受 Facebook 处理它的方式。既然你很好奇 - 我选择只在墙上张贴没有照片。对我来说重要的部分是实际的帖子,照片只是一个很好的补充。如果我确实需要这张照片,我会选择发布到我认为的相册,添加第 3 方照片主机只会增加另一层复杂性。感谢您的帮助!
  • @PsychoDad Instagram 本身也托管图像,他们似乎将其用于墙贴。相册中的图像看起来像是完全不同的操作(看起来像副作用但可能是不同的请求)
  • 环顾四周,我得出了同样的结论。加班我会有一个图片网站,到时候我可以做一个与消息的链接
【解决方案3】:

我不确定哪个部分不适合您,因为您正在发布并取回 ID,但这是我以一种快速而肮脏的方式所做的,以防有人通过 Google 到达这里。

这是一个 HTTP POST 函数,文件的二进制数据作为 multipart mime 上升。

我是可用的 ASIHTTPRequest 库here 的忠实粉丝。

**更新:2012 年 10 月 22 日 ** - 在过去的几个月里,AFNetworking 在我的代码中替换了 ASIHTTPRequest。可在 GitHub 上找到here

Facebook 的文档令人困惑,部分是因为它们不完整,部分是因为它们可能是错误的。您可能会费力地弄清楚要为标题或其他内容设置什么帖子值,但这个食谱会将照片放入相册,然后进入提要。

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

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

这将创建或添加一个名为“YOUR_APP_NAME Photos”的相册,并出现在用户的供稿中。您可以通过获取相册的 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];


}

【讨论】:

  • 谢谢,澄清一下我可以让照片出现在用户的提要中,但只能出现在第一张照片中。之后上传连续照片仍会将照片添加到相册中,但它似乎对提要没有任何其他作用。这听起来正常吗?
  • 另外,我尝试了 ASIFormDataRequest 方法 - 出现了图像消息,但名称、标题和描述似乎没有任何作用?
  • 您是正确的 - 发布照片似乎只允许“消息”字段。我已经编辑了上面的内容。
【解决方案4】:

使用 Facebook SDK 3.0:

- (void)postPhotoThenOpenGraphAction { FBRequestConnection *connection = [[FBRequestConnection alloc] init]; // 第一个请求上传照片。 FBRequest *request1 = [FBRequest requestForUploadPhoto:self.selectedPhoto]; [连接 addRequest:request1 完成处理程序: ^(FBRequestConnection *connection, id 结果, NSError *error) { 如果(!错误){ } } batchEntryName:@"photopost" ]; // 第二个请求检索刚刚创建的照片信息 // 照片所以我们可以获取它的来源。 FBRequest *request2 = [FBRequest requestForGraphPath:@"{result=photopost:$.id}"]; [连接 addRequest:request2 完成处理程序: ^(FBRequestConnection *connection, id 结果, NSError *error) { 如果 (!错误 && 结果) { NSString *source = [结果 objectForKey:@"source"]; [self postOpenGraphActionWithPhotoURL:source]; } } ]; [连接开始]; }

他们通过 OpenGraph 操作发布 ([self postOpenGraphActionWithPhotoURL:source];) 关注此帖子,但如果您只希望用户墙上的图像,则不需要。

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

耶!,FB SDK 3.0 摇滚!不再有 AppDelegate.facebook :)

【讨论】:

    【解决方案5】:

    我四处寻找适用于最新 API 的解决方案,直到我发现:

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

    到目前为止,我遇到过的最清晰的解决方案,简单且使用最新的 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多