0

我想这不是特定于视频上传的,因为我只是在图表上发帖,但是当我使用以下代码时,上传有时会停止。较小的视频 (<20MB) 确实可以通过,但较大的视频 (50 到 200 MB) 肯定会失败。

    NSData *videoData = [NSData dataWithContentsOfFile:video.localURL options:NSDataReadingMappedAlways error:&error];

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               videoData, video.localURL,
                               @"video/quicktime", @"contentType",
                               video.name, @"title",
                               NSLocalizedString(@"Test http://www.apple.com", @"Facebook upload description"), @"description",
                               nil];


FBRequest *request = [FBRequest requestWithGraphPath:@"me/videos" parameters:params HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSLog(@"result: %@, error: %@", result, error);
    [[NSNotificationCenter defaultCenter] postNotificationName:FacbookUploadFinishedNotification object:nil];

}];

我已修补 FBURLConnection 以获取有关上传进度的通知:

    - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite {

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:
                            [NSArray arrayWithObjects:
                              [NSNumber numberWithInt:totalBytesWritten],
                              [NSNumber numberWithInt:totalBytesExpectedToWrite],
                             nil]
                            forKeys:
                            [NSArray arrayWithObjects:
                             @"bytes",
                              @"totalBytes",
                              nil]
    ];


    [[NSNotificationCenter defaultCenter] postNotificationName:FacebookUploadProgressNotification
                                                        object:self
                                                      userInfo:userInfo];



}

在我看来,Facebook 服务器似乎只是停止响应...... didSendBodyData 停止被调用,并且请求在一段时间后超时。

使用 FB 应用上传相同的视频是可行的……</p>

编辑:啊,忘了补充我在这个应用程序中使用的 Facebook 应用程序 ID 尚未提交。请求是否可能会发送到一些(不太可靠的)测试服务器?上传的视频会出现在我的时间线中……</p>

4

1 回答 1

6

问题是 Facebook 只在https://graph-video.facebook.com接受较长的视频。SDK 不考虑这一点。

我的应用程序没有使用 3.x SDK 中包含的所有花哨的东西。我用自己的代码加载朋友信息和他们的图像(这就是我所需要的)。当使用 3.x SDK 的所有花里胡哨时,我的解决方案可能不起作用。

这是我所做的:

从您的项目中删除对先前安装的 SDK 的所有引用,包括搜索路径和框架。添加 Accounts.framework、AdSupport.framework、Social.framework 和 libsqlite3.0.dylib(如果您还没有这样做的话)。

从 GitHub 下载 SDK 的源代码。在 .zip 文件中,您会找到一个文件夹“src”。在您的项目目录中创建一个文件夹。将其命名为“facebook-ios-sdk”或您喜欢的任何名称。将包含子文件夹“JSON”的“src”文件夹的内容复制到新创建的文件夹中。

将文件夹拖到您的 Xcode 项目中。删除包含的 Xcode 项目和预编译头文件。之后,您的项目应该可以再次正常编译。视频不会上传。

打开FBRequestConnection.m

在所有#imports 添加后的第一行BOOL bGraphIsVideo = NO;

在下面的某些行中,您会发现一行阅读
NSString *const kGraphBaseURL...。
添加以下行:
NSString *const kGraphBaseURLVideo = @"https://graph-video." FB_BASE_URL @"/";

然后找方法urlStringForSingleRequest

更改行读数

baseURL = [kGraphBaseURL stringByAppendingString:request.graphPath];

if (bGraphIsVideo)
    baseURL = [kGraphBaseURLVideo stringByAppendingString:request.graphPath];
else
    baseURL = [kGraphBaseURL stringByAppendingString:request.graphPath];

在 .m 文件中添加以下静态方法

+ (void)setVideoMode:(BOOL)videoMode {
    bGraphIsVideo = videoMode;
}

…在 .h 文件中

+ (void)setVideoMode:(BOOL)videoMode;

现在更新您的代码以发布视频文件:

    [FBRequestConnection setVideoMode:YES];
    [FBRequestConnection startWithGraphPath:<Your path>
                                 parameters:<Your params>
                                 HTTPMethod:@"POST"
                          completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                              [FBRequestConnection setVideoMode:NO];

                              if(!error) {
                                  NSLog(@"OK: %@", result);
                              } else
                                  NSLog(@"Error: %@", error.localizedDescription);

                          }];

这对我来说就像一个魅力。请原谅此文本的可怕格式。这是我的第一个。

这绝对是一个黑客。我不想讨论如何让它变得更好。我只想将视频文件上传到 Facebook,不多也不少。因为我看到人们遇到了麻烦,所以我想分享我的做法。希望这可以帮助。

于 2013-03-31T23:27:44.763 回答