How to upload/share video on Facebook ?

2020-05-28 18:54发布

I am making a test app through that I want to post video on facebook. I am using latest sdk of facebook. But I am not able to post it on facebook.

My code is as below.

NSDictionary *parameters = [NSDictionary dictionaryWithObject:videoData forKey:@"CareAppDemo.mov"];

FBRequest *request = [FBRequest requestWithGraphPath:@"me/videos" parameters:parameters HTTPMethod:@"POST"];

[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                NSLog(@"result: %@, error: %@", result, error);
            }];

Please help me to post video on facebook via my app.

5条回答
劫难
2楼-- · 2020-05-28 19:32

Get the publish permission

NSArray* permissions = [[NSArray alloc] initWithObjects:
                            @"publish_stream", nil];
    [facebook authorize:permissions delegate:self];
    [permissions release];

Try this

- (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];
}
查看更多
Root(大扎)
3楼-- · 2020-05-28 19:37

You need to download FacebookSDK first and then add following framework into your project

FacebookSDK.framework, FBSDKLoginKit.framework, FBSDKShareKit.framework,
Bolts.framework,FBSDKCoreKit.framework

import them, and write followin code

if(![FBSDKAccessToken currentAccessToken])
    {
        FBSDKLoginManager *login1 = [[FBSDKLoginManager alloc]init];

        [login1 logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {

            FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init];

            video.videoURL = videoAssetURL;
            FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
            content.video = video;

            [FBSDKShareDialog showFromViewController:self withContent:content delegate:nil];




        }];
    }
    else {
        FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init];
        video.videoURL = videoAssetURL;
        FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
        content.video = video;

        [FBSDKShareDialog showFromViewController:self withContent:content delegate:nil];




    }

The video URL videoURL must be an asset URL. You can get a video asset URL e.g. from UIImagePickerController.

or for recording video you can take as follow

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:[[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"] stringByAppendingFormat:@"/current.mov"]] completionBlock:^(NSURL *assetURL, NSError *error)
 {

     videoAssetURL =assetURL;

 }];

for more detail you can use https://developers.facebook.com/docs/sharing/ios

查看更多
Anthone
4楼-- · 2020-05-28 19:45

This is the old thread but for all the future readers coming, here is how to do it with the currently latest facebook SDK (v3.24.0 - September 10th 2015).

- (IBAction)bntShareOnFacebookAction:(id)sender {

    if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
        [self shareVideoOnFacebook];
    } else {
        FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
        [loginManager logOut];  //very important line for login to work
        [loginManager logInWithPublishPermissions:@[@"publish_actions"]
                handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                        if(!error) {
                            [self shareVideoOnFacebook];
                        } 
                    }];
    }
}

- (void) shareVideoOnFacebook {

    NSString *videoPath = @"/Documents/.../movie.mov";
    NSData *videoData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoPath]];

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:3L];

    [params setObject:videoData forKey:@"video_filename.MOV"];
    [params setObject:@"Title for this post." forKey:@"title"];
    [params setObject:@"Description for this post." forKey:@"description"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"/me/videos" parameters:params HTTPMethod:@"POST"]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
         if (!error) {
             //video posted
         }
     }];
}
查看更多
一纸荒年 Trace。
5楼-- · 2020-05-28 19:45

IF you want to Upload/Video sharing you must need to pass the Assets Library URL for the original version of the picked item.

URL e.g assets-library://asset/asset.MOV?id=18BC70A0-208A-4F03-A207-7D57C8863425&ext=MOV

If you are using

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

Then you must need to pass

NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];

If you using Document Directory Path then first you need to save video into library. You must need to create url link Assets Library URL.

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

    [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:videoURL];

} completionHandler:^(BOOL success, NSError * _Nullable error) {

    if (success) {

        // Fetch Last saved video.
        PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
        fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:false]];

        // Get video url.
        PHAsset *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOptions].firstObject;
        NSString *assetID = [fetchResult.localIdentifier substringToIndex:(fetchResult.localIdentifier.length - 7)];
        NSURL *assetURL = [NSURL URLWithString:[NSString stringWithFormat:@"assets-library://asset/asset.MOV?id=%@&ext=MOV", assetID]];

        // Share Video.
        FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init];
        video.videoURL = assetURL;

        FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
        content.video = video;

        FBSDKShareDialog *shareDialog = [[FBSDKShareDialog alloc] init];
        shareDialog.shareContent = content;
        shareDialog.delegate = (id)self;
        shareDialog.fromViewController = self;
        NSError * error = nil;
        BOOL validation = [shareDialog validateWithError:&error];
        if (validation) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [shareDialog show];
            });
        } else {
            NSLog(@"%@", error.localizedDescription);
        }

    }

}];
查看更多
家丑人穷心不美
6楼-- · 2020-05-28 19:50

Successfully tested On FaceBook SDK 3.14.1

Recommendation: 3 properties in .plist file

set FacebookAppID,FacebookDisplayName,
URL types->Item 0->URL Schemes set to facebookappId prefix with fb See

-(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);
                                                                       }

                                                                   }];
                                         }
                                     }];
        }
}

I GOT Error In first time of App runs:

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

It happens when facebook is being inited. Next time i open my app, it works fine, its always the first time. Tried everything in app, but it seems to be on the Facebook SDK side.

Few causes for seeing com.facebook.sdk error 5:

  • Session is is not open. Validate.
  • Facebook has detected that you're spamming the system. Change video name.
  • Facebook has a defined limit using the SDK. Try a different app.
  • Wrong publish permission. Give publish_actions a spin.
  • many more....
查看更多
登录 后发表回答