iOS 7后台上传和POST请求

时间:2013-10-31 07:27:34

标签: ios objective-c file-upload ios7 nsurlsession

我需要在每次上传之前和之后使用其他HTTP POST 请求在后台上传文件。

之前我使用的是 beginBackgroundTaskWithExpirationHandler ,它在iOS 6中运行良好,但是从IOS 7开始,它仅受限制约180秒,这是一个值得关注的问题。

我已经阅读了有关NSURLSession的文件,我们有背景转移服务。但问题是它只允许在后台上传和下载。它不允许我在后台上传每次后发出POST请求。

那么有没有办法让POST请求和后台上传一起?

任何正确方向的暗示都将受到高度赞赏。

3 个答案:

答案 0 :(得分:5)

我认为您可以使用NSURLSessionDownloadTask发送POST。

IMO,下载任务并不意味着它用于下载。这意味着您的POST请求(json / xml)的响应将下载到本地文件。然后,您可以打开该文件并解析它以获取请求。

如果您愿意,甚至可以使用NSURLSessionDownloadTask将文件上传到S3。并且s3响应将被下载'到本地文件..

有关详细信息,请参阅Apple开发人员论坛https://devforums.apple.com/thread/210515?tstart=0

中的此问题

答案 1 :(得分:3)

我在后台任务的回调期间,在生产代码中成功完成了一次vanilla http调用。 callback是:

-[id<NSURLSessionTaskDelegate> URLSession:task:didCompleteWithError:]

你可以在那里做大约30秒来完成你需要做的事情。 在此期间进行的任何异步调用必须由

括起来
-[UIApplication beginBackgroundTaskWithName:expirationHandler:]

that的“结束任务”版本。否则,当您弹出堆栈时(当您等待异步过程时),iOS将终止您的进程。

顺便说一句,不要混淆UIApplication任务(我称之为“app tasks”)和NSURLSession任务(“会话任务”)。

答案 2 :(得分:0)

如果您使用uploadTaskWithRequest:fromData:completionHandler:,您可以从完成处理程序块发出HTTP POST请求:

[backgroundSession uploadTaskWithRequest:request fromData:data completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    if (httpResponse.statusCode == 200) {
        NSMutableURLRequest *postRequest = [NSMutableURLRequest requestForURL:[NSURL URLWithString:@"http://somethingorother.com/"]];
        request.HTTPMethod = @"POST";
        .
        .
        .
        NSURLResponse *postResponse;
        NSError *postError;
        NSData *postResponseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&postResponse error:&postError]; 
        // Check postResponse and postError to ensure that the POST succeeded
    }
}];