使用iOS8中的NSUrlSession通过流请求进行后台上传

时间:2015-02-04 06:49:24

标签: ios ios8 nsurlsession nsinputstream nsurlsessionuploadtask

以前在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);
}

2 个答案:

答案 0 :(得分:1)

您无法使用后台配置上传流式任务。我只在两种情况下成功上传数据:

  1. 使用存储在请求正文中的数据下载任务。
  2. 从文件上传任务。在这种情况下,您将不会收到回复正文。

答案 1 :(得分:0)

您可以在后台上传多部分文件 - 只是这不是直截了当的。请参阅:AFNetworking error in uploadTaskWithStreamedRequest