iPhone загрузка видео с Facebook - PullRequest
9 голосов
/ 18 марта 2011

Я работаю над этим уже пару дней и просто не могу найти ни одного прямого ответа или примера.Я пытаюсь загрузить видео на Facebook из приложения для iPhone.Я могу подключиться к Facebook (и загрузил изображения) без проблем, используя:

_facebook = [[Facebook alloc] initWithAppId:kAppID];
_permissions =  [[NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil] retain];
[_facebook authorize:_permissions delegate:self];

Однако я не могу заставить свою загрузку видео работать.Мой текущий код:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestMovie" ofType:@"mp4"];
NSData *data = [NSData dataWithContentsOfFile:filePath];

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               data, @"video",
                               nil, @"callback",
                               @"test", @"title",
                               @"upload testing", @"description",
                               @"EVERYONE", @"privacy",
                               nil];

[_facebook requestWithMethodName:@"video.upload"
                       andParams:params
                   andHttpMethod:@"POST"
                     andDelegate:self];

И так как вызовы для загрузки видео должны быть сделаны на другой сервер, я изменил URL restserver в файле facebook.m:

static NSString* kRestserverBaseURL = @"https://api-video.facebook.com/method/";

КогдаЯ запускаю это, загрузка вылетает с ошибкой:

facebookErrDomain err 353.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

С помощью Zoul теперь я реализовал следующий код (я ничего не сделал, чтобы изменить его класс загрузки или версию SDK, с которой он шел),Запрос больше не выдает ошибку, но ничего не загружается.

Я инициализирую объект facebook и объект загрузки:

_facebook = [[Facebook alloc] initWithAppId:kAppID];
_permissions =  [NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil];
[_facebook authorize:_permissions delegate:self];
_upload = [[FBVideoUpload alloc] init];  

И затем использую его, как только Facebook вошел в систему:

- (void)fbDidLogin{
    _upload.accessToken = _facebook.accessToken;
    _upload.apiKey = kApiKey;
    _upload.appSecret = kApiSecret;

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"mp4"];
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    NSData *data = [NSData dataWithContentsOfFile:filePath];

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               data, @"",
                               @"test", @"title",
                               @"upload testing", @"description",
                               @"EVERYONE", @"privacy",
                               nil];

    [_upload startUploadWithURL:fileURL params:params delegate:self];
}

Ответы [ 5 ]

10 голосов
/ 22 марта 2011

У меня есть ветка для загрузки видео в моей развилке Facebook SDK на GitHub.Я не трогал его несколько недель, но раньше он работал нормально (только для этого требуется аутентификация старого стиля, см. эту ветку ).В заголовке класса FBVideoUpload есть некоторые комментарии, но интерфейс в значительной степени не требует пояснений.Под моим запросом также есть полезное обсуждение - особенно это касается SSL-сертификатов в кластере api-video, которые могут облегчить весь вопрос, но я пока не просматривал код.

[Rant: Жаль, что Facebook SDK для iOS не совсем процветает на GitHub.Существует много запросов на получение данных, но официальные разработчики никогда не объединяют ничего, даже тривиальные исправления в документации.В большинстве случаев запросы на извлечение просто остаются там до тех пор, пока их не отклонят.]

И да, я упоминал, что код загрузки видео - грязный хак?Код загрузки видео - грязный взлом.Он анализирует некоторые токены аутентификации и может сломаться в ближайшее время, но это был единственный способ заставить его работать тогда.


Обновление: Ветвь загрузки видео больше не существуетТеперь вы можете легко загружать видео, используя официальный SDK:

NSData *videoData = [NSData dataWithContentsOfURL:movieURL];
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    …, @"title", 
    …, @"description", 
    …, @"file",
    videoData, @"clip.mov",
    nil];
[facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self];

Это «правильный способ сделать это» ™, предыдущее решение было просто временным взломом.

2 голосов
/ 22 августа 2012
- (void)viewDidLoad
{
    facebook = [[Facebook alloc] initWithAppId:@"276907032339239"];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (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];
    NSLog(@"hiiiiiiiii");

}

-(void)fbDidNotLogin:(BOOL)cancelled 
{

    NSLog(@"did not login");

}

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

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"Failed with error: %@", [error localizedDescription]);
}
2 голосов
/ 06 мая 2011

Вы можете использовать новый график API для загрузки видео:

  • Использовать меня / видео в качестве пути к графику
  • Добавить разрешение user_videos в ваше приложение
  • Установить имя файла, соответствующее расширению вашего файла в запросе POST (после Content-Disposition:)

Вы можете использовать этот форк https://github.com/johnmph/facebook-ios-sdk и иметь словарь параметров вроде этого:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:movieData, @"source", @"File.mov", @"filename", nil];
[m_facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self];

Я также добавил к этой ветке метод отслеживания статуса загрузки (например, для использования с индикатором выполнения)

0 голосов
/ 28 марта 2012

На самом деле все, стоит упомянуть, чтобы следить за различными инженерными блогами Facebook. Этот датирован октябрем 2011 года, поэтому у него нет «текущего» SDK: http://developers.facebook.com/blog/post/532/

Но пример все еще работает, если вы измените идентификатор пакета, добавите схему URL в список и добавите свой собственный идентификатор приложения в контроллер представления:

enter image description here

Это самая полезная информация, которую я нашел при загрузке видео - я не знаю, почему Facebook скрывает это от своих основных документов SDK! Это причудливо нигде не связано, мне пришлось немного покопаться ...

0 голосов
/ 22 марта 2011

Вы пытались отправить его на электронную почту, как Facebook, добавлено в http://www.facebook.com/help/?faq=12345 Вы можете использовать тему электронной почты, чтобы установить заголовок видео.

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