Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS8中使用NSUrlSession通过流请求进行后台上载_Ios_Ios8_Nsurlsession_Nsinputstream_Nsurlsessionuploadtask - Fatal编程技术网

在iOS8中使用NSUrlSession通过流请求进行后台上载

在iOS8中使用NSUrlSession通过流请求进行后台上载,ios,ios8,nsurlsession,nsinputstream,nsurlsessionuploadtask,Ios,Ios8,Nsurlsession,Nsinputstream,Nsurlsessionuploadtask,在前面的iOS7中,当我们尝试在后台使用流请求上载时,会出现以下异常 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“后台会话中的上载任务必须来自文件” 但在iOS8中,当我们尝试在后台使用流进行上传时,也不例外 现在我的问题是 1) iOS8中是否允许使用uploadTaskWithStreamedRequest:上传Backgord 2) 在iOS8中,我将后台NSURLConfiguration与uploadTaskWithStreamedRequest一

在前面的iOS7中,当我们尝试在后台使用流请求上载时,会出现以下异常

由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“后台会话中的上载任务必须来自文件”

但在iOS8中,当我们尝试在后台使用流进行上传时,也不例外

现在我的问题是

1) iOS8中是否允许使用uploadTaskWithStreamedRequest:上传Backgord

2) 在iOS8中,我将后台NSURLConfiguration与uploadTaskWithStreamedRequest一起使用。我正在使用-(void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务需要新的数据流:(void(^)(NSInputStream*)completionHandler向NSURLSession提供流。当应用程序在前台时,它工作正常,并将我的文件上传到服务器。但一旦应用程序在后台启动,流就结束,NSURLSession完成,并出现以下错误

Error Domain=nsurerrordomain Code=-997“与后台传输服务的连接中断”

我想当应用程序进入后台时,我的流就结束了。现在我的问题是,我应该在哪个runloop中安排我的流,或者让我知道我的理解是否有任何错误

-(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);
}

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

  • 下载数据存储在请求正文中的任务
  • 从文件上载任务。在这种情况下,您将不会收到响应正文

  • 你可以在后台上传一个多部分文件——只是这不是直接的。请参阅:

    如果您可以共享任何文档链接,指出backgroundTask只支持从文件上传,而不支持从正文或NSStream上传,那就太好了。不幸的是,他们没有记录很多关于后台传输的内容。我所知道的一切都是因为我们做了大量的研究。请注意,我们不鼓励这样做,因此答案应该是寻找解决方案的终点(而不是参考文献的另一个中途停留,随着时间的推移,这些参考文献往往会变得陈旧)。请考虑在这里添加一个独立的概要,将链接作为参考。