【问题标题】:iPhone Facebook Video UploadiPhone Facebook 视频上传
【发布时间】:2011-07-18 08:53:42
【问题描述】:

我已经为此工作了几天,但似乎无法在任何地方找到直接的答案或示例。我正在尝试从我的 iPhone 应用程序中将视频上传到 facebook。我可以毫无问题地连接到 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];

由于视频上传调用必须发送到不同的服务器,我将 facebook.m 文件中的 restserver url 更改为:

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

当我运行这个时,上传崩溃并出现错误:

facebookErrDomain err 353.

任何帮助将不胜感激。

编辑:

在 Zoul 的帮助下,我现在实现了以下代码(我没有改变他的上传类和它附带的 SDK 版本)。该请求不再出现错误,但没有上传任何内容。

我初始化了facebook对象和上传对象:

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

然后我在 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];
}

【问题讨论】:

  • 我无法添加此代码,因为在我的 facebook-ios-sdk FBVideoUpload 类中不存在.. 你能帮帮我吗
  • 现在我收到错误Unable to retrieve session key from the access token.
  • 但是在这种情况下,我的更新正常,没有会话错误
  • 我有一个非常简单的修复方法,您可以使用当前 iOS Facebook SDK 的一个功能:stackoverflow.com/questions/17927767/…

标签: iphone objective-c xcode facebook


【解决方案1】:

我在 GitHub 上的 Facebook SDK 的 fork 中有一个 video upload branch。我已经好几个星期没碰它了,但它以前可以正常工作(只是它需要旧式身份验证,请参阅this branch)。 FBVideoUpload class header 中有一些 cmets,但界面几乎是不言自明的。在我的pull request 下也有一些有用的讨论——尤其是关于api-video 集群上的 SSL 证书的事情,这可能会使整个问题变得更容易,但我还没有查看代码。

[Rant:很遗憾,iOS 版 Facebook 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];

这是“正确的做法”™,之前的解决方案只是临时破解。

【讨论】:

  • 感谢您的回复。我现在就试一试,看看效果如何。
  • @zoul - 我已经使用您拥有的 Facebook IOS SDK 版本实现了您的 FBVideoUpload 类。尽管我不再收到任何错误(通过 NSLog,我知道请求确实到达了 didLoad 方法),但我在 facebook 上什么也没得到。任何想法?我会将我当前的代码添加到我的问题中。
  • 我刚刚尝试了使用视频上传代码的应用程序,它可以工作。尝试去掉 data 参数,这里不需要它。你确定请求成功了吗?服务器的响应是什么?
  • 我会在没有数据参数的情况下尝试它。我会仔细检查服务器响应并在收到后将其发布在这里。
  • 就这么简单。确保我的应用程序设置为 HTML/Web 而不是本机,它就像一个魅力。谢谢你的帮助,zoul。
【解决方案2】:

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

  • 使用我/视频作为图形路径
  • 为您的应用添加 user_videos 权限
  • 在 POST 请求中设置文件名以匹配文件的扩展名(在 Content-Disposition: 之后)

您可以使用这个 fork https://github.com/johnmph/facebook-ios-sdk 并拥有这样的参数字典:

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

我还在这个 fork 中添加了一个跟踪上传状态的方法(例如与进度条一起使用)

【讨论】:

  • John 我认为您已经成功使用图形 API 上传视频?您能否为此分享一些示例代码?
  • 只需使用上面提到的 fork 的代码,m_facebook 是一个已经授权的 Facebook 对象(具有 user_videos 权限),movieData 是您要上传的视频的原始数据。
【解决方案3】:
- (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]);
}

【讨论】:

    【解决方案4】:

    您是否尝试将其发送到 Facebook 在http://www.facebook.com/help/?faq=12345 中建议的电子邮件 您可以使用电子邮件主题来设置视频的标题。

    【讨论】:

    • 因为据我所知,没有办法从 facebook 的图形 API 中提取用户的个人上传电子邮件地址。如果有这将是一个非常简单的解决方案。
    【解决方案5】:

    实际上,值得一提的是关注 Facebook 的各种工程博客。这个日期是 2011 年 10 月,因此没有“当前”SDK: http://developers.facebook.com/blog/post/532/

    但是如果你修改 bundle ID,将 URL 方案添加到 plist,并将你自己的 App ID 添加到视图控制器,示例仍然有效:

    这是我在视频上传中发现的最有用的信息——我不知道为什么 Facebook 将其从他们的主要 SDK 文档中隐藏起来!奇怪的是它没有链接到任何地方,我不得不做一些挖掘......

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2013-03-03
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多