关于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 之前,您必须获得发布(写入)权限,使用本机集成或 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 字典中,这与之前的解决方案不同,它与 titledescription(这是 2 个可选参数)一起存在。
另请注意,这里没有 Facebook 文档指定的密钥 source
密钥的名称是视频的文件名。我不知道为什么这不应该是 source,但是使用 source 会导致 com.facebook.sdk 错误 5.

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


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