загрузить видео на Facebook с помощью iOS6 Social Framework

Я хочу опубликовать видеофайл на facebook. Раньше я использовал Facebook iOS SDK3.0, и он работал. Однако для iOS6 Social Framework есть проблема.

 __block ACAccount * facebookAccount;
    ACAccountStore* accountStore = [[ACAccountStore alloc] init];
    NSDictionary *options = @{
    ACFacebookAppIdKey: @"MY APP ID",
    ACFacebookPermissionsKey: @[@"publish_actions", ], 
    @"ACFacebookAudienceKey": ACFacebookAudienceFriends
    };
    ACAccountType *facebookAccountType = [accountStore
                                          accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    [accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) {

        if (granted) {
            NSArray *accounts = [accountStore
                                 accountsWithAccountType:facebookAccountType];
            facebookAccount = [accounts lastObject];



            NSLog(@"access to facebook account ok %@", facebookAccount.username);

            NSData *videoData = [NSData dataWithContentsOfFile:[self videoFileFullPath]];
            NSLog(@"video size = %d", [videoData length]);
            NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                                     videoData, @"video.mov",
                                    @"video/quicktime", @"contentType" ,
                                    @"Video title", @"title",
                                    @"Video description", @"description",nil];

            NSURL *requestURL = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];
            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                                         requestMethod:SLRequestMethodPOST
                                                                                   URL:requestURL
                                                                            parameters:params];
            request.account = facebookAccount;
            [request performRequestWithHandler:^(NSData *data,                                                                  NSHTTPURLResponse *response,NSError * error){
                NSLog(@"response = %@", response);
                NSLog(@"error = %@", [error localizedDescription]);

            }];


        } else {
            NSLog(@"access to facebook is not granted");
            // extra handling here if necesary

        }

    }];

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[NSConcreteData _fastCharacterContents]: нераспознанный селектор отправлен в экземпляр 0x2097ead0»


person alex    schedule 04.10.2012    source источник
comment
Лучший формат, чтобы задать вопрос по программированию: {Вопрос}, {Связанный код}, {Ошибка}.   -  person Rohit Vipin Mathews    schedule 05.10.2012


Ответы (2)


Вот мое исследование: во-первых, видеоданные не могут быть частью списка параметров, так как это сделает SLRequest недействительным, и это сбой, который вы испытываете.

Видеоданные должны быть в многочастном разделе запроса.

Теперь необходимо связать параметры с составными данными, и это сложная часть. Поэтому необходимо использовать исходный атрибут, чтобы сделать эту ссылку.

Для источника требуется URL-адрес в строковом формате, укажите его в параметрах и установите такое же значение в поле имени файла в составном запросе.

Это должно сработать.

NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];

NSURL *videoPathURL = [[NSURL alloc]initFileURLWithPath:videoPath isDirectory:NO];
NSData *videoData = [NSData dataWithContentsOfFile:videoPath];

NSString *status = @"One step closer.";
NSDictionary *params = @{@"title":status, @"description":status};

SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                        requestMethod:SLRequestMethodPOST 
                                                  URL:url 
                                           parameters:params];

[request addMultipartData:videoData
                 withName:@"source"
                     type:@"video/quicktime" 
                 filename:[videoPathURL absoluteString]];
person Luis    schedule 09.10.2012
comment
Ты прав. Он не должен быть частью параметров. Я попробовал ваши предложения, и это работает. - person alex; 09.10.2012
comment
Я изменил несколько вещей в вашем фрагменте кода, имя MultipartData должно соответствовать требованиям Facebook, это должно быть source. Также у параметров было нерелевантное свойство имени, они должны быть title и description, которые являются необязательными. - person Daniel; 13.10.2012
comment
Можно ли создать это с помощью SDK? - person Iulian Onofrei; 12.11.2015

Я работаю над тем же вопросом. Я думаю, что ваша ошибка связана с ARC, и NSData *videoData удаляется до возврата из performRequestWithHandler.

person Kevin    schedule 05.10.2012
comment
Итак, вы можете загрузить успешно? Хорошо, тогда давайте попробуем найти способ сохранить видеоданные. - person alex; 08.10.2012
comment
Я попытался сместить видеоданные наружу, чтобы они были глобальными, и все равно столкнулся с той же ошибкой. - person alex; 09.10.2012