Попытка загрузить видео на Facebook с помощью FBConnect для iPhone - PullRequest
1 голос
/ 23 июня 2010

Я работаю над приложением, которое будет загружать видео на стену пользователей Facebook, однако успеха у меня не было.Я представляю расширенное диалоговое окно с разрешениями, а затем использую вызов метода face.video.upload.В отладчике кажется, что каждый параметр установлен правильно, однако диалоговое окно разрешений ext никогда не отображается полностью, а видеофайл никогда не загружается.

Видеофайл хранится в каталоге документов приложения (запись и воспроизведение работаютхорошо) но загрузка не работает.У меня есть параметры video.upload в методе dialogDidSucceed: и я изменил метод FBRequest.m generatePostBody: для приема видеофайлов.

Любая помощь будет огромной, поскольку я бьюсь головойстена на этом.Заранее спасибо.

Вот код контроллера вида:

-(IBAction)loginToFacebook
{
  session = [[FBSession sessionForApplication:kAPIKey secret:kAPISecret delegate:self] retain];

  FBLoginDialog *loginDialog = [[[FBLoginDialog alloc] initWithSession:session] autorelease];

  [loginDialog show];
}

-(IBAction)askPermission
{
  //---------------ask permission---------------------/
  FBPermissionDialog *permDialog = [[[FBPermissionDialog alloc]init]autorelease];

  permDialog.delegate = self;

  permDialog.permission = @"video_upload";

  [permDialog show];
}   


-(void)dialogDidSucceed:(FBPermissionDialog *)dialog
{

  //---------------video file path--------------------/
  NSString *path = [NSString stringWithFormat:@"%@/Documents/%@.mov", NSHomeDirectory(), aSelectedQuote.quoteID];

  //---------------video data converter---------------/

  NSData *videoData = [NSData dataWithContentsOfFile:path];

  videoFileName = [NSString stringWithUTF8String:[videoData bytes]];

  //---------------dict for FB upload-----------------/
  NSMutableDictionary *args = [[[NSMutableDictionary alloc] init] autorelease];

  [args setObject:videoFileName forKey:@"video"];
  [args setObject:aSelectedQuote.quoteTitle forKey:@"title"];

  //---------------FBRequest--------------------------/
  FBRequest *uploadVideoRequest = [FBRequest requestWithDelegate:self];

  [uploadVideoRequest call:@"facebook.video.upload" params:args dataParam:videoData];

  //[uploadVideoRequest call:@"facebook.video.upload" params:args];


  NSLog(@"Upload video button pushed.");

}

-(void)dialogDidCancel:(FBDialog *)dialog
{
  NSLog(@"user canceled request");
}



-(void)session:(FBSession *)session didLogin:(FBUID)uid
{
  NSLog(@"user with id %lld logged in.",uid);

  NSString *fql = [NSString stringWithFormat:@"select uid, name from user where uid == %lld", session.uid];

  NSDictionary *params = [NSDictionary dictionaryWithObject:fql forKey:@"query"];

  [[FBRequest requestWithDelegate:self] call:@"facebook.fql.query" params:params];

}

/*
  -(void)sessionDidLogout:(FBSession *)session
  {
  }
*/


-(void)request:(FBRequest *)request didLoad:(id)result
{
  if ([result isKindOfClass:[NSArray class]])
    {
      NSArray *users = result;
      NSDictionary *user = [users objectAtIndex:0];
      NSString *name = [user objectForKey:@"name"];

      NSLog(@"FBRequest didLoad: - logged in as %@",name);
    }
}

-(void)dialog:(FBDialog *)dialog didFailWithError:(NSError *)error
{
  NSLog(@"Error (%d) %@", [error code], [error localizedDescription]);
}

Вот код FBRequest.m:

- (NSMutableData*)generatePostBody {
  NSMutableData* body = [NSMutableData data];
  NSString* endLine = [NSString stringWithFormat:@"\r\n--%@\r\n", kStringBoundary];

  [self utfAppendBody:body data:[NSString stringWithFormat:@"--%@\r\n", kStringBoundary]];

  for (id key in [_params keyEnumerator]) {
    [self utfAppendBody:body
      data:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];
    [self utfAppendBody:body data:[_params valueForKey:key]];
    [self utfAppendBody:body data:endLine];
  }

  if (_dataParam != nil) {
    if ([_dataParam isKindOfClass:[UIImage class]]) {
      NSData* imageData = UIImagePNGRepresentation((UIImage*)_dataParam);
      [self utfAppendBody:body
        data:[NSString stringWithFormat:@"Content-Disposition: form-data; filename=\"photo\"\r\n"]];
      [self utfAppendBody:body
        data:[NSString stringWithString:@"Content-Type: image/png\r\n\r\n"]];
      [body appendData:imageData];
    } else {
      NSAssert([_dataParam isKindOfClass:[NSData class]], @"dataParam must be a UIImage or NSData");
      /*           
               [self utfAppendBody:body
               data:[NSString stringWithFormat:@"Content-Disposition: form-data; filename=\"data\"\r\n"]];
               [self utfAppendBody:body
               data:[NSString stringWithString:@"Content-Type: content/unknown\r\n\r\n"]];
               [body appendData:(NSData*)_dataParam];
      */
      if ([_method isEqualToString:@"facebook.video.upload"]) {
    [self utfAppendBody:body
          data:[NSString stringWithFormat:@"Content-Disposition: form-data; filename=\"data.mov\"\r\n"]];
    [self utfAppendBody:body
          data:[NSString stringWithString:@"Content-Type: video/quicktime\r\n\r\n"]];
      }
      else {
    [self utfAppendBody:body
          data:[NSString stringWithFormat:@"Content-Disposition: form-data; filename=\"data\"\r\n"]];
    [self utfAppendBody:body
          data:[NSString stringWithString:@"Content-Type: content/unknown\r\n\r\n"]];
      }

    }
    [self utfAppendBody:body data:endLine];
  }

  FBLOG2(@"Sending %s", [body bytes]);
  return body;
}

1 Ответ

0 голосов
/ 02 июля 2010

Вы устанавливаете videoFileName для необработанных байтов видеофайла:

videoFileName = [NSString stringWithUTF8String:[videoData bytes]];
....
[args setObject:videoFileName forKey:@"video"];

Я думаю, вы имели в виду:

videoFileName = [path lastPathComponent];

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...