3

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

以前我使用的是beginBackgroundTaskWithExpirationHandler,它在 iOS 6 之前运行良好,但从 IOS 7 开始,它被限制为大约 180 秒,这是一个问题。

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

那么有什么方法可以在后台上传的同时发出 POST 请求?

任何正确方向的提示将不胜感激。

4

3 回答 3

5

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

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

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

有关更多信息,请参阅苹果开发者论坛中的此问题https://devforums.apple.com/thread/210515?tstart=0

于 2013-11-20T06:54:58.113 回答
3

http在生产代码中,我在后台任务的回调期间成功地往返了一个普通调用。回调是:

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

你有大约 30 秒的时间来做你需要做的事情。在此期间进行的任何异步调用都必须用括号括起来

-[UIApplication beginBackgroundTaskWithName:expirationHandler:]

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

顺便说一句,不要混淆UIApplication任务(我称它们为“应用程序任务”)和NSURLSession任务(“会话任务”)。

于 2013-11-12T20:07:24.443 回答
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
    }
}];
于 2013-10-31T10:08:41.600 回答