【问题标题】:upload video to facebook using facebook sdk 3.1 on ios 6.0在 ios 6.0 上使用 facebook sdk 3.1 将视频上传到 facebook
【发布时间】:2012-10-03 10:04:04
【问题描述】:

我的一个应用是将视频上传到 Facebook 帐户。 我在网上查了一下,但发现大多数解决方案都是旧的或已删除。 有没有更新的解决方案?

欢迎评论

【问题讨论】:

标签: objective-c ios facebook api ios6


【解决方案1】:

publish_stream不足以上传(读取),需要请求“video_upload”权限。

【讨论】:

    【解决方案2】:

    上下文

    在您可以发布到 Facebook 之前,您必须获得发布(写入)权限,使用本机集成或 Facebook SDK,规则是您必须先获得读取权限,然后再获得写入权限。

    因此,请确保在您尝试上传视频之前,您应该已请求基本信息(例如电子邮件),然后,一旦您拥有此信息,您就可以请求写入权限。上传视频所需的权限是publish_stream

    使用 iOS 6 原生 Facebook 集成

    使用原生 iOS 6 Facebook 集成,您应该使用 requestForServiceType:requestMethod:URL:parameters: SLRequest的方法,如下:

    - (void)upload{
        NSURL *videourl = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];
    
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
        NSURL *pathURL = [[NSURL alloc]initFileURLWithPath:filePath isDirectory:NO];
        NSData *videoData = [NSData dataWithContentsOfFile:filePath];
    
        NSDictionary *params = @{
                                @"title": @"Me being silly",
                                @"description": @"Me testing the video upload to Facebook with the new system."
                                };
    
        SLRequest *uploadRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                      requestMethod:SLRequestMethodPOST
                                                                URL:videourl
                                                         parameters:params];
        [uploadRequest addMultipartData:videoData
                               withName:@"source"
                                   type:@"video/quicktime"
                               filename:[pathURL absoluteString]];
    
        uploadRequest.account = self.facebookAccount;
    
        [uploadRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
            NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
            if(error){
                NSLog(@"Error %@", error.localizedDescription);
            }else
                NSLog(@"%@", responseString);
        }];
    }
    

    这里需要注意的是视频数据不进入参数字典,必须使用addMultipartData:withName:type:filename:方法添加到SLRequest对象中。

    另请注意,添加视频数据时文件名非常重要。这里我只是使用文件的完整路径。

    使用 Facebook SDK 3.1 库

    如果您必须支持比 iOS 6 更早的 iOS 版本,或者您出于任何其他原因希望使用 Facebook SDK 3.1,则上传视频略有不同。

    您必须使用 FBRequest 对象和包含视频详细信息的 NSDictionary。我推荐使用的方法是requestWithGraphPath:parameters:HTTPMethod:,尽管您应该能够使用其他一些方法来创建您的请求对象,但我还是出于偏好使用了此方法。

    以下代码使用 Facebook SDK 3.1 上传视频:

    - (void)upload{
        if (FBSession.activeSession.isOpen) {
            NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
            NSURL *pathURL = [[NSURL alloc]initFileURLWithPath:filePath isDirectory:NO];
            NSData *videoData = [NSData dataWithContentsOfFile:filePath];
    
            NSDictionary *videoObject = @{
                                          @"title": @"FB SDK 3.1", 
                                          @"description": @"hello there !", 
                                          [pathURL absoluteString]: videoData
                                         };
            FBRequest *uploadRequest = [FBRequest requestWithGraphPath:@"me/videos"
                                                            parameters:videoObject
                                                            HTTPMethod:@"POST"];
    
            [uploadRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                if (!error)
                    NSLog(@"Done: %@", result);
                else
                    NSLog(@"Error: %@", error.localizedDescription);
            }];
        }
    }
    

    如您所见,我们将视频数据添加到parameters 字典中,与之前的解决方案不同,它与titledescription(这是两个可选参数)一起存在。 另请注意,这里没有 Facebook 文档指定的密钥 source。 密钥的名称是视频的文件名。我不知道为什么这不应该是source,但是使用源会导致 com.facebook.sdk 错误 5

    我提到的错误是我向 Facebook 提交的,您可以在 this link 上查看此报告 - 除非我对文档的解释有误。如果您可以重现它,请尝试该错误并报告。谢谢!

    【讨论】:

    • 我在 ios6 和 4,5 上测试了这两种方法,但它们(facebook 示例 [hackbook])从未用于视频上传,- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse * ) 永远不会触发响应
    • 您没有使用 Facebook iOS SDK 3.1。这是 Facebook 的一个新框架。您需要从 Facebook 开发者网站获取它,并且需要将其安装到您的 Mac 上,您还必须确保正确设置它。按照开发者网站上的说明进行操作。
    • 我已经更新了问题,我在 fackbook ios sdk 中使用了 hackbook 示例,上传照片是可以的,但是对于视频上传,- (void)request:(FBRequest *)request didReceiveResponse 从未触发和报告http 状态错误 400 最后,我没有更改 Facebook 示例代码,我在山狮、xcode 4.5、iOS 6 基础 sdk、iOS 6 模拟器上工作
    • 我刚刚在 SDK 中查看了 Facebook 提供的示例项目,您正在使用的项目(我没有检查其他项目),它针对 iOS 4.0 并且正在使用 FBConnect。它包括新的 Facebook SDK 框架,但没有使用它。所以看起来 Facebook 没有为新的 SDK 更新他们的示例项目。我自己做了一个示例项目,在这里查看:bitbucket.org/danielphillips/fb-video-upload
    • @Daniel 你在这里有很好的答案,但是我被困在一个地方。您是从文件系统中挑选视频,从 iPhone 的相册中挑选视频或使用相机如何?应该写什么: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"me" ofType:@"mov"];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多