2011-03-18 108 views
9

我一直在这个工作了几天,现在似乎无法在任何地方找到直接的答案或例子。我正尝试从iPhone应用程序中将视频上传到Facebook。我可以连接到Facebook(并上传了图片),而无需使用一个问题:iPhone Facebook的视频上传

_facebook = [[Facebook alloc] initWithAppId:kAppID]; 
_permissions = [[NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil] retain]; 
[_facebook authorize:_permissions delegate:self]; 

但是我似乎无法让我的视频上传工作。我当前的代码是:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestMovie" ofType:@"mp4"]; 
NSData *data = [NSData dataWithContentsOfFile:filePath]; 

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           data, @"video", 
           nil, @"callback", 
           @"test", @"title", 
           @"upload testing", @"description", 
           @"EVERYONE", @"privacy", 
           nil]; 

[_facebook requestWithMethodName:@"video.upload" 
         andParams:params 
        andHttpMethod:@"POST" 
        andDelegate:self]; 

而且由于视频上传呼叫具有不同的服务器来进行,我改变了restserver网址facebook.m文件内:

static NSString* kRestserverBaseURL = @"https://api-video.facebook.com/method/"; 

当我运行这个上传崩溃的错误:

facebookErrDomain err 353. 

任何帮助,将不胜感激。

编辑:

随着Zoul的帮助下,我现在已经实现了下面的代码(我没有做什么改变了他上传类也不附带的SDK版本)。该请求不会再出现错误,但不会上传任何内容。

我初始化Facebook的对象和上传对象:

- (void)fbDidLogin{ 
    _upload.accessToken = _facebook.accessToken; 
    _upload.apiKey = kApiKey; 
    _upload.appSecret = kApiSecret; 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"mp4"]; 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
    NSData *data = [NSData dataWithContentsOfFile:filePath]; 

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           data, @"", 
           @"test", @"title", 
           @"upload testing", @"description", 
           @"EVERYONE", @"privacy", 
           nil]; 

    [_upload startUploadWithURL:fileURL params:params delegate:self]; 
} 
+0

我不能添加该代码,在我的Facebook-IOS-SDK FBVideoUpload类是不存在的..你能帮帮我 – 2011-04-05 06:23:12

+0

现在我得到错误'无法从访问令牌检索会话密钥.' – 2011-04-05 07:35:07

+0

但我的更新提取好了在这种情况下没有会话错误 – 2011-04-05 07:43:58

回答

10

我在GitHub的Facebook SDK中有一个video upload branch。我几个星期没有碰它,但它曾经工作得很好(只需要旧式认证,见this branch)。 FBVideoUpload class header中有一些评论,但界面几乎不言自明。在我的pull request下面还有一些有用的讨论 - 特别是关于api-video群集上的SSL证书的事情,这可能会使整个问题更容易些,但我没有审查代码。

[Rant:可惜Facebook的iOS SDK并没有在GitHub上茁壮成长。有很多拉请求,但官方开发人员似乎从来没有合并任何东西,甚至没有在文档中错误的拼写错误。大多数时候拉请求只是坐在那里,直到被拒绝。]

是的,我提到视频上传代码是一个混乱的黑客?视频上传代码是一个混乱的黑客。它解析了一些认证令牌,并且很快就会中断,但这是我当时唯一可以做到的唯一方法。


更新:视频上传分支也没有了,你现在可以轻松地使用官方的SDK上传视频:

NSData *videoData = [NSData dataWithContentsOfURL:movieURL]; 
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    …, @"title", 
    …, @"description", 
    …, @"file", 
    videoData, @"clip.mov", 
    nil]; 
[facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

这是“正确的方式去做”™,以前的解决方案只是一个临时攻击。

+0

谢谢你的回应zoul。我现在就给这个镜头看看它是怎么回事。 – 2011-03-22 13:19:42

+0

@zoul - 我已经使用您的Facebook IOS SDK版本实现了您的FBVideoUpload类。虽然我不再有任何错误(通过NSLog我知道请求确实达到了didLoad方法),但我在facebook上没有收到任何信息。任何想法?我会将我目前的代码添加到我的问题中。 – 2011-03-22 17:57:56

+0

我刚刚尝试使用视频上传代码的应用程序,它可以正常工作。尝试摆脱'data'参数,这里不需要。你确定请求成功吗?服务器的回应是什么? – zoul 2011-03-22 18:56:10

0

你尝试把它发送到电子邮件如Facebook sugested:

_facebook = [[Facebook alloc] initWithAppId:kAppID]; 
_permissions = [NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil]; 
[_facebook authorize:_permissions delegate:self]; 
_upload = [[FBVideoUpload alloc] init]; 

然后,我用它一旦Facebook在已经登录在http://www.facebook.com/help/?faq=12345 您可以使用电子邮件主题设置视频的标题。

+0

因为据我所知,没有办法提取用户的个人上传来自Facebook图表API的电子邮件地址。如果这是一个非常简单的解决方案。 – 2011-03-22 14:48:14

2

您可以使用新的图形API上传视频:

  • 用我/作为图形路径视频
  • 添加user_videos许可,您的应用程序
  • 设置文件名匹配在POST请求的文件的扩展名(后内容处置:)

您可以使用此叉https://github.com/johnmph/facebook-ios-sdk,有一个PARAM字典这样的:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:movieData, @"source", @"File.mov", @"filename", nil]; 
[m_facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

我也加入到这个叉追踪上传状态(通过例如用进度条使用)

+0

John我认为你已经成功地使用图形API上传视频了吗?你会如此友善地分享一些示例代码? – 2011-05-10 14:02:14

+0

只需使用上面提到的fork的代码,m_facebook是已经授权的Facebook对象(具有user_videos权限),movieData是您想要上传的视频的原始数据。 – Johnmph 2011-05-11 14:20:39

0

其实一切,这是值得一提,以保持眼睛在Facebook上的各种工程博客的方法。这是一个从2011年10月日,因此不存在“当前” SDK: http://developers.facebook.com/blog/post/532/

但是,如果修改了包ID,URL模式添加到plist中,并添加您自己的App样本仍然有效ID的视图控制器:

enter image description here

这是最有用的信息我已经在视频上传发现 - 我不知道为什么Facebook的掩盖这个从他们的主要SDK文档了!它奇怪的是没有在任何地方的联系,我不得不做一些挖掘周围...

2
- (void)viewDidLoad 
{ 
    facebook = [[Facebook alloc] initWithAppId:@"276907032339239"]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
- (IBAction)buttonClicked:(id)sender 
{ 
    NSArray* permissions = [[NSArray alloc] initWithObjects: 
          @"publish_stream", nil]; 
    [facebook authorize:permissions delegate:self]; 
    [permissions release]; 
} 
- (void)fbDidLogin 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mov"]; 
    NSData *videoData = [NSData dataWithContentsOfFile:filePath]; 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            videoData, @"video.mov", 
            @"video/quicktime", @"contentType", 
            @"Video Test Title", @"title", 
            @"Video Test Description", @"description", 
            nil]; 
    [facebook requestWithGraphPath:@"me/videos" 
         andParams:params 
        andHttpMethod:@"POST" 
         andDelegate:self]; 
    NSLog(@"hiiiiiiiii"); 

} 

-(void)fbDidNotLogin:(BOOL)cancelled 
{ 

    NSLog(@"did not login"); 

} 

- (void)request:(FBRequest *)request didLoad:(id)result 
{ 
    if ([result isKindOfClass:[NSArray class]]) 
    { 
     result = [result objectAtIndex:0]; 
    } 
    NSLog(@"Result of API call: %@", result); 
} 

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"Failed with error: %@", [error localizedDescription]); 
}