Пакетная загрузка фотографий на Facebook iOS - PullRequest
14 голосов
/ 06 января 2012

У меня возникли проблемы при попытке получить iOS SDK Facebook для пакетной загрузки фотографий.В настоящее время я могу загружать их один за другим, но я хотел бы, если это возможно, группировать запросы.Я прочитал этот пост снова и снова вместе с fb batch docs .Вот что у меня есть до сих пор.

 Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

        NSData *imageData = UIImagePNGRepresentation([imgs objectAtIndex:0]);
   NSString *jsonRequest1 = [NSString stringWithFormat:@"{ \"method\": \"POST\",    \"relative_url\": \"me/photos\", \"attached_files\": \"file1\" }"];
        NSString *jsonRequest2 = [NSString stringWithFormat:@"{ \"method\": \"POST\", \"relative_url\": \"me/photos\", \"attached_files\": \"file2\" }"];
        NSString *jsonRequestsArray = [NSString stringWithFormat:@"[ %@, %@ ]", jsonRequest1, jsonRequest2];


    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:jsonRequestsArray,@"batch",imageData,@"file1",imageData,@"file2" nil];

Я сопоставляю imageData с ключом, который он ищет, но каждый раз получаю этот ответ.

  {
        body = "{\"error\":{\"message\":\"File batch has not been attached\",\"type\":\"GraphBatchException\"}}";
        code = 400;
        headers =         (
                        {
                name = "WWW-Authenticate";
                value = "OAuth \"Facebook Platform\" \"invalid_request\" \"File batch has not been attached\"";
            },
                        {
                name = "HTTP/1.1";
                value = "400 Bad Request";
            },
                        {
                name = "Cache-Control";
                value = "no-store";
            },
                        {
                name = "Content-Type";
                value = "text/javascript; charset=UTF-8";
            }
        );
    },
        {
        body = "{\"error\":{\"message\":\"File file2 has not been attached\",\"type\":\"GraphBatchException\"}}";
        code = 400;
        headers =         (
                        {
                name = "WWW-Authenticate";
                value = "OAuth \"Facebook Platform\" \"invalid_request\" \"File file2 has not been attached\"";
            },
                        {
                name = "HTTP/1.1";
                value = "400 Bad Request";
            },
                        {
                name = "Cache-Control";
                value = "no-store";
            },
                        {
                name = "Content-Type";
                value = "text/javascript; charset=UTF-8";
            }
        );
    }
)

Любая помощьочень ценится.

Ответы [ 5 ]

2 голосов
/ 25 марта 2014

Попробуйте с этим.

Обратите внимание, что Facebook ограничивает количество запросов, которые могут быть в партии, до 50.

-(void)uploadBulkPhotosToAlbum:(NSArray *)photoArray albumId:(NSString *)albumId

    FBRequestConnection *connection = [[FBRequestConnection alloc] init];
    NSString *graphPath = [NSString stringWithFormat:@"%@/photos",albumId];

    NSMutableString *jsonFormat = [[NSMutableString alloc] init];
    [jsonFormat setString:@"["];

    for (int i = 0; i < photoArray.count; i++)
    {
        if (i != 0)
        {
            [jsonFormat appendString:@","];
        }

        NSString *fileName = [NSString stringWithFormat:@"file%d",i];
        NSString *jsonRequest = [NSString stringWithFormat:@"{ \"method\": \"POST\",    \"relative_url\": \"%@\", \"attached_files\": \"%@\" }",graphPath,fileName];
        [jsonFormat appendString:[NSString stringWithFormat:@" %@",jsonRequest]];
    }

    [jsonFormat appendString:@" ]"];

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:jsonFormat,@"batch",nil];


    for (int i = 0; i < photoArray.count; i++)
    {
        NSString *fileName = [NSString stringWithFormat:@"file%d",i];

        NSData *data = UIImagePNGRepresentation([photoArray objectAtIndex:i]);
        [params setObject:data forKey:fileName];
    }

    FBRequest *request = [FBRequest requestWithGraphPath:@"me"  parameters:params HTTPMethod:@"POST"];
    [connection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (!error)
        {
            [self resetViewAfterUpload:result];
        }
        else
        {
            [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
            NSLog(@"Photo uploaded failed :( %@",error.userInfo);
            [[[UIAlertView alloc] initWithTitle:@"Error occurred!!" message:@"Some error occured while uploading." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]  show];
        }
    }];
    [connection start];
}
2 голосов
/ 21 апреля 2013

Вы пытались использовать Социальную среду для iOS 6 для обмена фотографиями? Это позволяет добавлять все фотографии и делиться ими.

- (IBAction)postToFacebook:(id)sender {
    if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {

        SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

        [controller setInitialText:@"First post from my iPhone app"];
        [controller addURL:[NSURL URLWithString:@"http://www.jinibot.com"]];
        [controller addImage:[UIImage imageNamed:@"socialsharing-facebook-image.jpg"]];

        //add as many images as you want
        [controller addImage:[UIImage imageNamed:@"socialsharing-facebook-image.jpg"]];
        [controller addImage:[UIImage imageNamed:@"socialsharing-facebook-image.jpg"]];
        [controller addImage:[UIImage imageNamed:@"socialsharing-facebook-image.jpg"]];

        [self presentViewController:controller animated:YES completion:Nil];
    }
}
1 голос
/ 10 сентября 2012

С помощью нового Facebook SDK (3.0) попробуйте что-то вроде этого:

FBRequestConnection *connection = [[FBRequestConnection alloc] init];

FBRequest *request1 = [FBRequest requestForUploadPhoto:image1];
[connection addRequest:request1
     completionHandler:
 ^(FBRequestConnection *connection, id result, NSError *error) {
     //handle error/success
 }
 ];

FBRequest *request2 = [FBRequest requestForUploadPhoto:image2];
[connection addRequest:request2
     completionHandler:
 ^(FBRequestConnection *connection, id result, NSError *error) {
     //handle error/success
 }
 ];

[connection start];
0 голосов
/ 05 августа 2013

Вот функция, которую я использовал в одном из наших проектов Facebook SDK 3.x

-(void)postOnFacebookWall : (id )response{

    NSString *strPost = [NSString stringWithFormat:@"Group Name:%@",[[response valueForKey:@"GroupDetail"] valueForKey:@"group_name"]];
    NSString *strUrl = [NSString stringWithFormat:@"%@",[[response valueForKey:@"GroupDetail"] valueForKey:@"group_picture_path"]];
    NSURL *urlToShare = [NSURL URLWithString:strUrl];
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:urlToShare]];

    FBAppCall *appCall = [FBDialogs presentShareDialogWithLink:urlToShare
                                                      name:@"Heook"
                                                   caption:@"string"
                                               description:@"The 'Has."
                                                   picture:urlToShare
                                               clientState:nil
                                                   handler:^(FBAppCall *call, NSDictionary *results, NSError *error) {
                                                       if (error) {
                                                           NSLog(@"Error: %@", error.description);
                                                       } else {
                                                           NSLog(@"Success!");
                                                       }
                                                   }];

    if (!appCall) {
        // Next try to post using Facebook's iOS6 integration
        BOOL displayedNativeDialog = [FBDialogs presentOSIntegratedShareDialogModallyFrom:self
                                                                          initialText:strPost
                                                                                image:image
                                                                                  url:nil
                                                                              handler:nil];

        if (!displayedNativeDialog) {
            [self performPublishAction:^{
            //              NSString *message = [NSString stringWithFormat:@"Group Name:%@\nGroup Image:%@\n",[[response valueForKey:@"GroupDetail"] valueForKey:@"group_name"],[[response valueForKey:@"GroupDetail"] valueForKey:@"group_picture_path"]];

            [FBRequestConnection startForPostStatusUpdate:strPost
                                        completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

                                            [self showAlert:@"Group shared on facebook" result:result error:error];
                                        }];


        }];
    }
}

}

0 голосов
/ 05 июня 2013

Как насчет использования NSOperationQueue для постановки в очередь всех запросов на загрузку?

...