我想这不是特定于视频上传,因为我只是在对图表进行发布,但是当我使用以下代码时,上传有时会停止。较小的视频 (<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 应用程序上传相同的视频是可行的......
编辑:啊,忘了补充一点,我在这个应用程序中使用的 Facebook 应用程序 ID 尚未提交。请求是否可能会发送到某些(不太可靠的)测试服务器?上传的视频虽然出现在我的时间轴中......
最佳答案
问题是 Facebook 只在 https://graph-video.facebook.com 接受更长的视频. SDK 不考虑这一点。
我的应用并未使用 3.x SDK 中包含的所有花哨内容。我用我自己的代码加载 friend 信息和他们的图像(这就是我所需要的)。在使用 3.x SDK 的所有附加功能时,我的解决方案可能行不通。
这是我做的:
从您的项目中删除对先前安装的 SDK 的所有引用,包括搜索路径和框架。添加 Accounts.framework、AdSupport.framework、Social.framework 和 libsqlite3.0.dylib(如果您尚未添加)。
从 GitHub 下载 SDK 的源代码。在 .zip 文件中,您会找到一个文件夹“src”。在您的项目目录中创建一个文件夹。将其命名为“facebook-ios-sdk”或您喜欢的任何名称。将包含子文件夹“JSON”的“src”文件夹的内容复制到新创建的文件夹。
将文件夹拖到您的 Xcode 项目中。删除包含的 Xcode 项目和预编译 header 。之后,您的项目应该可以再次正常编译。视频不会上传。
打开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);
}];
这对我来说就像一个魅力。请原谅本文糟糕的格式。这是我的第一个。
这绝对是一个 hack。我不想讨论如何让它变得更好。我只是想上传一个视频文件到Facebook,不多也不少。因为我看到人们对此有困难,所以我想分享我的做法。希望这会有所帮助。
关于ios - 使用 iOS Facebook SDK 3.2.1 的视频上传随机停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15638776/