2014-01-28 3 views
5

Я делаю тестовое приложение, через которое я хочу опубликовать видео на facebook. Я использую последние sdk в facebook. Но я не могу опубликовать его на facebook.Как загрузить/поделиться видео на Facebook?

Мой код такой, как показано ниже.

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

Пожалуйста, помогите мне опубликовать видео на facebook через мое приложение.

+0

Посмотрите изображение и загрузите его оттуда. вы только установили в нем приложение facebook. –

ответ

1

Лучший пример, чтобы загрузить видео на Facebook Check it

Скачать с ссылке ниже, что только iPhone

enter image description here

+0

Скажите, как запустить этот код в iPhone-симуляторе? – Hitendra

1

Получить публикацию разрешения

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]; 
} 
+0

Я использовал этот код. но не работал. Я получил ошибку lik this error: Error Domain = facebookErrDomain Code = 10000 «Операция не может быть завершена. (FacebookErrDomain error 10000.)« UserInfo = 0x758a250 {error = { code = 100; message = "API-вызовы с сервера требуют аргумента appsecret_proof"; type = GraphMethodException; – Hitendra

+0

Так что я предполагаю, что ваша настройка приложения для appsecret_proof включена, но вы не используете последнюю версию IOS SDK, поэтому appcesret_proof не генерируется. Возможно, вы захотите проверить настройки на панели приложений> Настройка> Дополнительно> Безопасность. – Retro

4

успешно испытана на FaceBook SDK 3.14.1

Рекомендация: 3 свойства в файле .plist

набор FacebookAppID, FacebookDisplayName,
URL types-> Пункт 0-> URL схемы установлен префикс facebookappId с fbSee

-(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 Ошибка в первый раз в App работает:

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

Это происходит, когда facebook в настоящее время inited. В следующий раз, когда я открою свое приложение, он отлично работает, его всегда в первый раз. Пробовал все в приложении, но, похоже, это на стороне SDK для Facebook.

Несколько причин видеть com.facebook.sdk error 5:

  • сессия является не открыта. Подтвердить.
  • Facebook обнаружил, что вы спам системы. Измените имя видео.
  • Facebook имеет определенный предел, используя SDK. Попробуйте другое приложение.
  • Неверное разрешение на публикацию. Дайте publish_actions спину.
  • много больше ....
+0

Это работает, но вы когда-нибудь выяснили, как обойти проблему впервые? Id liek исправить, если смогу. –

+1

, когда вы не одобряете свое приложение из Facebook. Тогда это даст ошибку в первый раз. После одобрения Facebook он работает успешно. –

+0

Удивительное спасибо за подсказку. Я на самом деле закончил писать хак, чтобы он работал так же, вложив другой вызов после первого - так что если вы тестируете, вы не получите отображаемую ошибку. –

5

Вам необходимо скачать FacebookSDK первую , а затем добавьте следующую структуру в проект

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

импортировать их, и написать код followin

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




    } 

Видео URL-адрес videoURL должен быть URL-адресом ресурса. Вы можете получить URL-адрес видеообъявления, например.от UIImagePickerController.

или для записи видео вы можете взять следовать

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

    videoAssetURL =assetURL; 

}]; 

более подробно вы можете использовать https://developers.facebook.com/docs/sharing/ios

+0

Это работает. Но не существует способа добавить заголовок и описание к видео. – jose920405

+0

да нет возможности добавить заголовок и описание из-за, см. Раздел 2.3 https://developers.facebook.com/policy. Но мы можем дать еще один вариант пользователю перед публикацией. скопируйте текст описания в буфер обмена (используя UIPasteboard) и покажите предупреждение пользователю, например: «Комментарии были скопированы в ваш буфер обмена, чтобы вставить их в сообщение». перед публикацией видео. – jay

1

Это старая нить, но и для всех будущих читателей идет, вот как это сделать с последним в настоящее время 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 
     } 
    }]; 
} 
+0

Не добавляет ли предварительно заполненное описание нарушение политики Facebook? https://developers.facebook.com/docs/apps/review/prefill – Matt

+0

@Matt - поля жестко запрограммированы только для демонстрационных целей, чтобы сделать код более читаемым. Не стесняйтесь извлекать эту информацию из пользовательского ввода. –

0

Если вы хотите добавить/видео необходимо нужно передать Assets URL библиотеки для оригинальной версии подобранного пункта.

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

Если вы используете

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

Затем необходимо необходимо пройти

NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL]; 

Если вы используете путь к директории документов, то сначала вам нужно сохранить видео в библиотеку. Вам необходимо создать URL-адрес URL-адреса 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); 
     } 

    } 

}]; 
Смежные вопросы