iOS Facebook SDK 3.2.1的视频上传随机停止

Hae*_*ntz 0 facebook ios facebook-ios-sdk

我想这不是特定于视频上传,因为我只是在图表上发帖子,但是当我使用下面的代码时,上传有时会停止.较小的视频(<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];

}];
Run Code Online (Sandbox Code Playgroud)

我修补了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];



}
Run Code Online (Sandbox Code Playgroud)

对我而言,Facebook服务器似乎停止响应... didSendBodyData停止调用,请求在一段时间后超时.

使用FB应用程序上传相同的视频有效...

编辑:啊,忘了添加我在这个应用程序中使用的Facebook应用程序ID尚未提交.这些请求是否可能会转到某些(不太可靠)的测试服务器?上传的视频会显示在我的时间轴中...

小智 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];
Run Code Online (Sandbox Code Playgroud)

if (bGraphIsVideo)
    baseURL = [kGraphBaseURLVideo stringByAppendingString:request.graphPath];
else
    baseURL = [kGraphBaseURL stringByAppendingString:request.graphPath];
Run Code Online (Sandbox Code Playgroud)

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

+ (void)setVideoMode:(BOOL)videoMode {
    bGraphIsVideo = videoMode;
}
Run Code Online (Sandbox Code Playgroud)

...并在.h文件中

+ (void)setVideoMode:(BOOL)videoMode;
Run Code Online (Sandbox Code Playgroud)

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

    [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);

                          }];
Run Code Online (Sandbox Code Playgroud)

这对我来说就像一个魅力.请原谅这段文字的可怕格式.这是我的第一个.

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