Фоновая загрузка с потоковым запросом с использованием NSUrlSession в iOS8

Ранее в iOS7, когда мы пытались загрузить запрос потока в фоновом режиме, мы получали следующее исключение

Приложение завершает работу из-за необработанного исключения "NSGenericException", причина: "Загрузки задач в фоновых сеансах должны быть из файла"

Но в iOS8 нет исключений, когда мы пытаемся загрузить поток в фоновом режиме.

Теперь мой вопрос

1) Разрешена ли загрузка backgourd с помощью uploadTaskWithStreamedRequest: в iOS8?

2) В iOS8 я использую фоновую NSURLConfiguration с uploadTaskWithStreamedRequest. Я использую -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandler для предоставления потока в NSUrlSession. Когда приложение находится на переднем плане, оно работает нормально и загружает мой файл на сервер. Но как только приложение переходит в фоновый режим, поток заканчивается, и NSURLSession завершается со следующей ошибкой

Error Domain=NSURLErrorDomain Code=-997 "Потеряно соединение со службой фоновой передачи"

Я думаю, что когда приложение переходит в фоновый режим, мой поток заканчивается. Теперь мой вопрос заключается в том, в каком цикле выполнения я должен запланировать свой поток или сообщить мне, есть ли какая-либо ошибка в моем понимании.

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

person Nauman Afzaal    schedule 04.02.2015    source источник


Ответы (2)


Вы не можете загружать потоковые задачи с помощью фоновой конфигурации. Я успешно загружаю данные только в двух случаях:

  1. Скачать задачу с данными, хранящимися в теле запроса.
  2. Загрузить задание из файла. В этом случае вы не получите тело ответа.
person Skie    schedule 10.02.2015
comment
Было бы здорово, если бы вы могли поделиться ссылкой на любой документ, чтобы указать, что backgroundTask поддерживает загрузку только из файла, а не из тела или NSStream? - person Ekra; 07.04.2015
comment
К сожалению, они не задокументировали много вещей, касающихся фоновой передачи. Все это я знаю, потому что мы провели много исследований. - person Skie; 10.04.2015

Вы можете загрузить составной файл в фоновом режиме — просто это не так просто. См.: Ошибка AFNetworking в uploadTaskWithStreamedRequest

person tuttu47    schedule 18.08.2015
comment
Обратите внимание, что ответы только по ссылкам не рекомендуются, ответы SO должны быть конечной точкой поиска. для решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, рассмотрите возможность добавления здесь отдельного синопсиса, оставив ссылку в качестве справочной информации. - person kleopatra; 18.08.2015