【问题标题】:How to share video in facebook SDK?如何在 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?

谢谢

【问题讨论】:

标签: ios facebook video


【解决方案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,请删除此答案/问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多