使用iOS8中的NSUrlSession使用stream请求进行背景上传

之前在iOS7中,当我们尝试在后台使用stream请求上传时,我们得到以下exception

终止应用程序,由于未捕获的exception'NSGenericException',原因:'在后台会话中上传任务必须来自文件'

但是在iOS8中,我们尝试在后台使用stream上传时没有出现exception。

现在我的问题是

1)是不是上传与uploadTaskWithStreamedRequest:允许在iOS8?

2)在iOS8中,我使用了带有uploadTaskWithStreamedRequest的后台NSURLConfiguration。 我正在使用– (void)URLSession:(NSURLSession *)会话任务:(NSURLSessionTask *)任务needNewBodyStream:(void(^)(NSInputStream *))completionHandler提供stream到NSUrlSession。 当应用程序在前台它工作正常,上传我的文件到服务器。 但是一旦应用程序在后台启动,stream将结束,并且NSURLSession完成,并显示以下错误消息

错误域= NSURLErrorDomain代码= -997“丢失连接到后台传输服务”

我认为当应用程序在后台我的stream结束。 现在我的问题是,我应该在哪些runloop我应该安排我的stream,或让我知道如果我的理解有任何错误。

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandler { // Open producer/consumer streams. We open the producerStream straight // away. We leave the consumerStream alone; NSURLConnection will deal // with it. NSLog(@"%@", [NSThread currentThread]); NSInputStream *consStream; NSOutputStream *prodStream; [NSStream createBoundInputStream:&consStream outputStream:&prodStream bufferSize:SFAMaxBufferLength]; assert(consStream != nil); assert(prodStream != nil); self.consumerStream = consStream; self.producerStream = prodStream; self.producerStream.delegate = self; [self.producerStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [self.producerStream open]; // Set up our state to send the body prefix first. self.buffer = [self.bodyPrefixData bytes]; self.bufferLimit = [self.bodyPrefixData length]; completionHandler(self.consumerStream); } 

您无法使用“后台configuration”上传stream式传输的任务。 我只能在两种情况下成功上传数据:

  1. 用存储在请求体内的数据下载任务。
  2. 从file upload任务。 在这种情况下,您将不会收到回复正文。

你可以在后台上传一个多部分文件 – 只是这不是直接的。 请参阅: uploadTaskWithStreamedRequest中的AFNetworking错误