如何在 facebook SDK 中分享视频?

Posted

技术标签:

【中文标题】如何在 facebook SDK 中分享视频?【英文标题】:How to share video in facebook SDK? 【发布时间】:2013-10-25 11:25:02 【问题描述】:

我在资源中存在文件的地方编写了如下代码。它不为空。

我成功添加了图片,但卡在了视频上。

-(void)uploadVideo 

    NSLog(@"UPload Videio ");

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"abc" ofType:@"mp4"];

    NSError *error = nil;


    NSData *data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingUncached error:&error];

    if(data == nil && error!=nil) 
        //Print error description

        NSLog(@"error is %@", [error description]);
    

    NSLog(@"data is %@", data);

    NSDictionary *parameters = [NSDictionary dictionaryWithObject:data forKey:@"sample.mov"];

    if (FBSession.activeSession.isOpen) 


        [FBRequestConnection startWithGraphpath:@"me/videos"
                                     parameters:parameters
                                     HTTPMethod:@"POST"
                              completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                                //  [FBRequestConnection setVideoMode:NO];

                                  if(!error) 
                                      NSLog(@"OK: %@", result);
                                   else
                                      NSLog(@"Error: %@", error.localizedDescription);

                              ];

     else 

        // We don't have an active session in this app, so lets open a new
        // facebook session with the appropriate permissions!

        // Firstly, construct a permission array.
        // you can find more "permissions strings" at http://developers.facebook.com/docs/authentication/permissions/
        // In this example, we will just request a publish_stream which is required to publish status or photos.

        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"publish_stream",
                                nil];
        //[self controlStatusUsable:NO];
        // OPEN Session!
        [FBSession openActiveSessionWithPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session,
                                                      FBSessionState status,
                                                      NSError *error) 
                                      // if login fails for any reason, we alert
                                      if (error) 

                                          // show error to user.

                                       else if (FB_ISSESSIONOPENWITHSTATE(status)) 

                                          // no error, so we proceed with requesting user details of current facebook session.


                                          [FBRequestConnection startWithGraphPath:@"me/videos"
                                                                       parameters:parameters
                                                                       HTTPMethod:@"POST"
                                                                completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                                                                    //  [FBRequestConnection setVideoMode:NO];

                                                                    if(!error) 
                                                                        NSLog(@"Result: %@", result);
                                                                     else
                                                                        NSLog(@"ERROR: %@", error.localizedDescription);

                                                                ];





                                          //[self promptUserWithAccountNameForUploadPhoto];
                                      
                                      // [self controlStatusUsable:YES];
                                  ];
    


作为回报,我收到错误

The operation couldn’t be completed. (com.facebook.sdk error 5.)

如何使用 facebook ios SDK 将视频上传到 facebook?

谢谢

【问题讨论】:

查看FB推荐的视频格式。 从哪里传,只能传链接吗? facebook.com/help/www/218673814818907 他们推荐mp4。 请在此处使用新的 facebook SDK ***.com/a/29427089/2787452查看它 【参考方案1】:

这是一种将视频上传到 Facebook 的方法。此代码正在测试并且 100% 正常工作。

ACAccountStore *accountStore = [[ACAccountStore alloc] init];

ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

// Specify App ID and permissions
NSDictionary *options = @ACFacebookAppIdKey: FACEBOOK_ID,
                          ACFacebookPermissionsKey: @[@"publish_stream", @"video_upload"],
                          ACFacebookAudienceKey: ACFacebookAudienceFriends; // basic read permissions

[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *e) 
    if (granted) 
        NSArray *accountsArray = [accountStore accountsWithAccountType:facebookAccountType];

        if ([accountsArray count] > 0) 
            ACAccount *facebookAccount = [accountsArray objectAtIndex:0];


            NSDictionary *parameters = @@"description": aMessage;


            SLRequest *facebookRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                            requestMethod:SLRequestMethodPOST
                                                                      URL:[NSURL URLWithString:@"https://graph.facebook.com/me/videos"]
                                                               parameters:parameters];

            [facebookRequest addMultipartData: aVideo
                                     withName:@"source"
                                         type:@"video/mp4"
                                     filename:@"video.mov"];

            facebookRequest.account = facebookAccount;


            [facebookRequest performRequestWithHandler:^(NSData* responseData, NSHTTPURLResponse* urlResponse, NSError* error) 
                if (error == nil) 
                    NSLog(@"responedata:%@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
                else
                    NSLog(@"%@",error.description);
                
            ];
        
     else 
        NSLog(@"Access Denied");
        NSLog(@"[%@]",[e localizedDescription]);
    
];

【讨论】:

publish_streamvideo_upload 都不存在了。【参考方案2】:

推荐:

我认为这可能是权限问题,但我不确定错误是在哪里引发的。将抛出的委托方法未显示在您的代码中。我认为将您的代码与sample 中的步骤进行协调可能会有所帮助;如果是,请接受答案。

样本的一些关键方面:

权限:

- (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];

请求 didLoad 委托方法:

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

请求 didFail 委托方法:

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

Facebook 视频权限Link

【讨论】:

【参考方案3】:

此代码已在 FaceBook SDK 3.14.1 上成功测试

推荐:在.plist中

设置 FacebookAppID、FacebookDisplayName、 URL types->Item 0->URL Schemes 设置为带有 fb 前缀的 facebookappId

-(void)shareOnFaceBook

    //sample_video.mov is the name of file
    NSString *filePathOfVideo = [[NSBundle mainBundle] pathForResource:@"sample_video" ofType:@"mov"];

    NSLog(@"Path  Of Video is %@", filePathOfVideo);
    NSData *videoData = [NSData dataWithContentsOfFile:filePathOfVideo];
    //you can use dataWithContentsOfURL if you have a Url of video file
    //NSData *videoData = [NSData dataWithContentsOfURL:shareURL];
    //NSLog(@"data is :%@",videoData);
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               videoData, @"video.mov",
                               @"video/quicktime", @"contentType",
                               @"Video name ", @"name",
                               @"description of Video", @"description",
                               nil];

   if (FBSession.activeSession.isOpen)
   
        [FBRequestConnection startWithGraphPath:@"me/videos"
                                 parameters:params
                                 HTTPMethod:@"POST"
                          completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                              if(!error)
                              
                                  NSLog(@"RESULT: %@", result);
                                  [self throwAlertWithTitle:@"Success" message:@"Video uploaded"];
                              
                              else
                              
                                  NSLog(@"ERROR: %@", error.localizedDescription);
                                  [self throwAlertWithTitle:@"Denied" message:@"Try Again"];
                              
                          ];
    
    else
    
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                            @"publish_actions",
                            nil];
        // OPEN Session!
        [FBSession openActiveSessionWithPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone  allowLoginUI:YES
                                     completionHandler:^(FBSession *session,
                                                         FBSessionState status,
                                                         NSError *error) 
                                         if (error)
                                         
                                             NSLog(@"Login fail :%@",error);
                                         
                                         else if (FB_ISSESSIONOPENWITHSTATE(status))
                                         
                                             [FBRequestConnection startWithGraphPath:@"me/videos"
                                                                          parameters:params
                                                                          HTTPMethod:@"POST"
                                                                   completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                                                                       if(!error)
                                                                       
                                                                           [self throwAlertWithTitle:@"Success" message:@"Video uploaded"];

                                                                           NSLog(@"RESULT: %@", result);
                                                                       
                                                                       else
                                                                       
                                                                           [self throwAlertWithTitle:@"Denied" message:@"Try Again"];

                                                                           NSLog(@"ERROR: %@", error.localizedDescription);
                                                                       

                                                                   ];
                                         
                                     ];
        

我遇到了错误:

 The operation couldn’t be completed. (com.facebook.sdk error 5.)

在启动 facebook 时发生。下次我打开我的应用程序时,它运行良好,它总是第一次。尝试了应用程序中的所有内容,但似乎是在 Facebook SDK 方面。

看到com.facebook.sdk error 5的几个原因:

会话未打开。验证。 Facebook 检测到您正在向系统发送垃圾邮件。更改视频名称。 Facebook 对使用 SDK 有明确的限制。尝试其他应用。

【讨论】:

【参考方案4】:

您之前是否请求过publish_stream 权限?

【讨论】:

该权限已替换为publish_actions,请删除此答案/问题。

以上是关于如何在 facebook SDK 中分享视频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Facebook SDK 分享视频

如何在 Facebook 上的 iPhone 应用程序中分享我的页面内容?

如何在 Facebook SDK 中创建自定义分享按钮

如何在 android 中使用 Twitter kit 3 在 Twitter 中分享视频?

如何在 React Native 中分享社交网络上的深层链接

在 facebook 中分享标题图片和描述