以前在iOS7中,当我们尝试在后台使用流请求上传时,我们会得到以下异常
由于未捕获的异常终止应用' NSGenericException',原因:'后台会话中的上传任务必须来自文件'
但是在iOS8中,当我们尝试在后台使用流上传时,也不例外。
现在我的问题是
1)在iOS8中允许使用 uploadTaskWithStreamedRequest:上传backgourd吗?
2)在iOS8中,我使用背景NSURLConfiguration和 uploadTaskWithStreamedRequest 。我正在使用 - (void)URLSession:(NSURLSession *)会话任务:(NSURLSessionTask *)任务needNewBodyStream:(void(^)(NSInputStream *))completionHandler 为NSUrlSession提供流。当应用程序在前台时它工作正常并将我的文件上传到服务器。但是,只要应用程序在后台运行,流就会结束,并且NSURLSession会以跟随错误
完成错误域名= NSURLErrorDomain代码= -997"与后台转移服务失去联系"
我认为当应用程序进入后台时,我的流程结束了。现在我的问题是,我应该在哪个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);
}
答案 0 :(得分:1)
您无法使用后台配置上传流式任务。我只在两种情况下成功上传数据:
答案 1 :(得分:0)
您可以在后台上传多部分文件 - 只是这不是直截了当的。请参阅:AFNetworking error in uploadTaskWithStreamedRequest