Facebook 批量上传照片 iOS

14

我正在尝试使用 Facebook iOS SDK 批量上传照片,但遇到了一些困难。目前我可以逐个上传它们,但如果可能的话,我想批处理请求。我已经反复阅读了这篇文章以及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

你尝试使用过 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];
    }
}

每张图片都被单独发布了。是否可以将多张图片合并成一篇帖子进行分享? - venky

2

请尝试以下方法。

请注意,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];
}

@Madhuri 你指的 "albumId" 是什么意思?我只有本地路径图片,没有来自任何本地服务器的图片。 - Mohd Sadham

1

使用 新的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

0

这是我在一个使用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];
                                        }];


        }];
    }
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接