关于objective C:在 ios 6.0 上使用 facebook sdk 3.1 将视频上传到 facebook

upload video to facebook using facebook sdk 3.1 on ios 6.0

我的一个应用是将视频上传到 facebook 帐户。
我在网上查了一下,但发现大多数解决方案都是旧的或已删除。
有没有更新的解决方案?

欢迎评论

相关讨论

  • 这些 Facebook 示例项目尚未针对新的 SDK 进行更新。
  • 请在此处使用新的 facebook SDK 检查:stackoverflow.com/a/29427089/2787452

语境

在您可以发布到 Facebook 之前,您必须获得发布(写入)权限,使用本机集成或 Facebook SDK,规则是您必须首先获得读取权限,然后才能写入权限。

因此,请确保在尝试上传视频之前,您应该已经请求了基本信息(例如电子邮件),然后,一旦您有了这些信息,您就可以请求写入权限。上传视频所需的权限是 publish_stream.

使用 iOS 6 原生 Facebook 集成

使用原生 iOS 6 Facebook 集成,您应该使用 requestForServiceType:requestMethod:URL:parameters:
SLRequest的方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- (void)upload{
    NSURL *videourl = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
    NSURL *pathURL = [[NSURL alloc]initFileURLWithPath:filePath isDirectory:NO];
    NSData *videoData = [NSData dataWithContentsOfFile:filePath];

    NSDictionary *params = @{
                            @"title": @"Me being silly",
                            @"description": @"Me testing the video upload to Facebook with the new system."
                            };

    SLRequest *uploadRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                  requestMethod:SLRequestMethodPOST
                                                            URL:videourl
                                                     parameters:params];
    [uploadRequest addMultipartData:videoData
                           withName:@"source"
                               type:@"video/quicktime"
                           filename:[pathURL absoluteString]];

    uploadRequest.account = self.facebookAccount;

    [uploadRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        if(error){
            NSLog(@"Error %@", error.localizedDescription);
        }else
            NSLog(@"%@", responseString);
    }];
}

这里需要注意的是视频数据不进入参数字典,必须使用addMultipartData:withName:type:filename:方法添加到SLRequest对象中。

还要注意,添加视频数据时,文件名非常重要。这里我只是使用文件的完整路径。

使用 Facebook SDK 3.1 库

如果您必须支持比 iOS 6 更早的 iOS 版本,或者您出于任何其他原因希望使用 Facebook SDK 3.1,则上传视频有点不同。

您必须使用一个 FBRequest 对象和一个包含视频详细信息的 NSDictionary。我推荐使用的方法是 requestWithGraphPath:parameters:HTTPMethod:,尽管您应该能够使用其他一些方法来创建您的请求对象,但我还是出于偏好使用了此方法。

以下代码使用 Facebook SDK 3.1 上传视频:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)upload{
    if (FBSession.activeSession.isOpen) {
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
        NSURL *pathURL = [[NSURL alloc]initFileURLWithPath:filePath isDirectory:NO];
        NSData *videoData = [NSData dataWithContentsOfFile:filePath];

        NSDictionary *videoObject = @{
                                      @"title": @"FB SDK 3.1",
                                      @"description": @"hello there !",
                                      [pathURL absoluteString]: videoData
                                     };
        FBRequest *uploadRequest = [FBRequest requestWithGraphPath:@"me/videos"
                                                        parameters:videoObject
                                                        HTTPMethod:@"POST"];

        [uploadRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
            if (!error)
                NSLog(@"Done: %@", result);
            else
                NSLog(@"Error: %@", error.localizedDescription);
        }];
    }
}

如您所见,我们将视频数据添加到 parameters 字典中,这与之前的解决方案不同,它与 title 和 description(这是 2 个可选参数)一起存在。
另请注意,这里没有 Facebook 文档指定的密钥 source。
密钥的名称是视频的文件名。我不知道为什么这不应该是 source,但是使用 source 会导致 com.facebook.sdk 错误 5.

我提到的错误是我向 Facebook 提交的,您可以在此链接上查看此报告 - 除非我对文档的解释有误。如果您可以重现它,请尝试该错误并报告。谢谢!

相关讨论

  • 我在 ios6 和 4,5 上测试了这两种方法,但它们(facebook 示例 [hackbook] )从未用于视频上传, - (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response 永远不会被触发
  • 您没有使用 Facebook iOS SDK 3.1。这是 Facebook 的一个新框架。您需要从 Facebook 开发者网站获取它,并且需要将其安装到您的 Mac 上,您还必须确保正确设置它。按照开发者网站上的说明进行操作。
  • 我已经更新了问题,我在 fackbook ios sdk 中使用了 hackbook 示例,上传照片还可以,但是对于视频上传,- (void)request:(FBRequest *)request didReceiveResponse 从未触发并最终报告 http 状态错误 400,我改变了没有 Facebook 示例代码,我在山狮、xcode 4.5、iOS 6 基础 sdk、iOS 6 模拟器上工作
  • 我刚刚在 SDK 中查看了 Facebook 提供的示例项目,而您正在使用的那个(我没有查看其他项目),它针对 iOS 4.0 并且正在使用 FBConnect。它包括新的 Facebook SDK 框架,但没有使用它。所以看起来 Facebook 没有为新的 SDK 更新他们的示例项目。我自己做了一个示例项目,在这里查看:bitbucket.org/danielphillips/fb-video-upload
  • 您需要在上传之前"获取我"(在写入权限之前读取权限)
  • 我们可以从 Facebook 获取墙帖列表吗...因为我想要在我的应用程序中使用图片和视频。或者我们可以从 iPhone 应用程序中的 Facebook 获取任何视频吗?
  • @Daniel您在这里有很好的答案,但是我被困在一个地方。您正在从文件系统中挑选视频,如何从 iPhone 的相册中挑选视频或使用相机?该行应该包含什么: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
  • @Daniel 请告诉我如何在这一行中添加"self.facebookAccount"?我在这一行添加了什么?请告诉我 。
  • @Daniel 请告诉我 ..self.facebookAccount 是什么意思。我可以在哪里定义。?
  • @Daniel 我怎么知道打开的会话具有 public_stream 权限?
  • 是否可以添加视频数据以在 Twitter 上共享?

publish_stream 不足以上传(读取),需要请求"video_upload"权限。


以上是关于objective C:在 ios 6.0 上使用 facebook sdk 3.1 将视频上传到 facebook的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>