5

One of my app is to upload video to facebook account. I checked on web, but found that most of solution are old or removed. Is there any updated solution?

Welcome any comment

4

2 回答 2

20

语境

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

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

使用 iOS 6 原生 Facebook 集成

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

- (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);
    }];
}

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

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

使用 Facebook SDK 3.1 库

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

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

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

- (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字典中,这与之前的解决方案不同,它与titleand description(这是 2 个可选参数)一起存在。另请注意,这里没有 key source,正如 Facebook 文档所指定的那样。密钥的名称是视频的文件名。我不知道为什么不应该这样source,但是使用 source 会导致com.facebook.sdk 错误 5

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

于 2012-10-13T02:34:16.313 回答
1

publish_stream上传(阅读)不够,需要申请“ video_upload”权限。

于 2013-04-03T07:10:28.553 回答