使用NSURLSessionDataTask的iOS后台任务

我有我的应用程序中的飞行searchfunction,这是花了太长的时间来获取数据(超过25秒)。 如果应用程序进入后台或进入睡眠模式,则互联网连接断开。

我已经写了下面的逻辑使用苹果的例子,使API请求继续,即使如果应用程序去背景,但它不工作。

self.session = [self backgroundSession]; self.mutableData = [NSMutableData data]; NSURL *downloadURL = [NSURL URLWithString:@"http://jsonplaceholder.typicode.com/photos"]; NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL]; self.dataTask = [self.session dataTaskWithRequest:request]; [self.dataTask resume]; - (NSURLSession *)backgroundSession { static NSURLSession *session = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.example.apple-samplecode.SimpleBackgroundTransfer.BackgroundSession"]; session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; }); return session; } 

下面是委托方法

 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSLog(@"response: %@", response.debugDescription); NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; if (completionHandler) { completionHandler(disposition); } } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { [self.mutableData appendData:data]; } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { BLog(); if (error == nil) { NSData *data = nil; if (self.mutableData) { data = [self.mutableData copy]; self.mutableData = nil; } NSError* error; NSArray* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; if (!json) { NSLog(@"Error parsing JSON: %@", error); } else { NSLog(@"Data: %@", json); } } else { NSLog(@"Task: %@ completed with error: %@", task, [error localizedDescription]); } double progress = (double)task.countOfBytesReceived / (double)task.countOfBytesExpectedToReceive; dispatch_async(dispatch_get_main_queue(), ^{ self.progressView.progress = progress; }); self.dataTask =nil; } 

一切正常,当应用程序在前台,但只要我把应用程序的背景获取低于错误信息。

完成错误:与后台传输服务的连接丢失

您不能将数据任务用于后台传输。 这些必须使用下载任务完成

下载任务以文件forms检索数据,并在应用程序未运行时支持后台下载。

这在Apple的文档中有解释。

另外请务必查看他们的后台传输注意事项 :

对于后台会话,由于实际传输是由单独的进程执行的,因为重新启动应用程序的过程相对昂贵,所以有一些function不可用,导致以下限制…

这里的关键在于它在单独的进程中运行,不能访问你保存在内存中的数据。 它必须通过一个文件路由。

我在(长篇) 博客文章中收集了关于iOS背景传输的大量信息。