我需要在每次上传之前和之后使用其他HTTP POST 请求在后台上传文件。
之前我使用的是 beginBackgroundTaskWithExpirationHandler ,它在iOS 6中运行良好,但是从IOS 7开始,它仅受限制约180秒,这是一个值得关注的问题。
我已经阅读了有关NSURLSession的文件,我们有背景转移服务。但问题是它只允许在后台上传和下载。它不允许我在后台上传每次后发出POST请求。
那么有没有办法让POST请求和后台上传一起?
任何正确方向的暗示都将受到高度赞赏。
答案 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
}
}];