iOS8: NSURLSession: NSURLSessionDataTask «Клиент закрыл соединение до получения всего ответа»

Я использую iOS BACKGROUND FETCH n BACKGROUND TRANSFER для обновления нашего приложения.

Когда мы загружаем MP4 как часть большой загрузки большого количества файлов, загрузка может внезапно остановиться и получить ошибку:

«Клиент закрыл соединение до получения полного ответа»

http-код по-прежнему 200.

У нас нет ограничений на данные из-за корпоративных учетных записей сотовой связи, и у нас есть отдельные приложения на нашем iPad, поэтому руководство хочет, чтобы мы загружали больший объем данных и количество файлов где-то более 20/30 при чистой установке. Это корпоративные видео/pdf-файлы, публикуемые ежедневно.

Я создал NSURLSession

NSURLSession * backgroundSession_ = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]

Затем для каждого URL-адреса mp4 или PDF я создаю NSURLSessionDownloadTask из моего NSURLSession.

NSURLSessionDownloadTask * downloadTask_ = [backgroundSession_ downloadTaskWithURL:url_];

Запуск возобновляется при каждой задаче загрузки. Когда все возвращаются, NSURLSession завершается, и я сообщаю пользователю в уведомлении, что приложения были обновлены.

Я использую CHARLES PROXY на своем Mac для мониторинга загрузок. Это занимает некоторое время, так как файлов много, а также я заметил, что фильмы кажутся потоковыми, поэтому могут быть медленными. Обычно он проверяет, что было загружено, и загружает только последнее, но если я делаю много загрузок, скажем, для чистой установки, я заметил, что часто потоки в mp4 убиваются. У них есть код 200, но с сообщением

«Клиент закрыл соединение до получения полного ответа»

Любая идея, что может вызвать это, потому что это может помешать завершению моей NSURLSession, поэтому моя синхронизация может попасть в своего рода зависшее состояние.

ИЗОБРАЖЕНИЕ: OK СКАЧАТЬ: ПОТОКИ ФИЛЬМОВ И СОХРАНЕНИЕ НА ДИСК: 200: Завершено

ИЗОБРАЖЕНИЕ:ОК СКАЧАТЬ: ПОТОКИ ФИЛЬМОВ И СОХРАНЕНИЕ НА ДИСК: 200: Завершено

ИЗОБРАЖЕНИЕ: ЗАГРУЗКА ВНЕЗАПНО ОСТАНАВЛИВАЕТСЯ:

ИЗОБРАЖЕНИЕ: ЗАГРУЗКА ВНЕЗАПНО ОСТАНАВЛИВАЕТСЯ:ИЗОБРАЖЕНИЕ: ЗАГРУЗКА ВНЕЗАПНО ОСТАНАВЛИВАЕТСЯ:

Любые идеи: я использую фоновую выборку, поэтому не уверен, является ли клиент в сообщении iOS8 или моим приложением. После того, как каждая задача загрузки возвращается, я копирую файл tmp в mp4 в документах и ​​вызываю

[session finishTasksAndInvalidate];

если некоторые из этих задач загрузки завершатся неудачно, я замечаю, что сеанс никогда не завершается и зависает. Когда я делаю еще одну выборку, я получаю все эти старые задачи загрузки и старые сеансы.


person brian.clear    schedule 26.11.2014    source источник
comment
Вы нашли решение этой проблемы? Мне интересно, если это Charles-Bug, поскольку у меня точно такая же проблема...   -  person niggeulimann    schedule 14.06.2017
comment
два года назад, но, согласно комментарию в моем коде, я включил тайм-аут - см. ответ ниже   -  person brian.clear    schedule 14.06.2017
comment
Большой! Я проверю это!   -  person niggeulimann    schedule 14.06.2017


Ответы (2)


спросили, как я решил это, но два года спустя.

Мы также уменьшили файлы фильмов, чтобы ускорить загрузку. Я также помню, что сеанс и конфигурация имели отдельные настройки. Я установил заголовок в одном, но потерпел неудачу, когда вышла iOS 8/9, поскольку он должен был быть установлен в сеансе, а не только в конфигурации, но может быть исправлен сейчас, когда вышла iOS 10.

//-----------------------------------------------------------------------------------
    //some movie streams time out n get
    //'http://stackoverflow.com/questions/23428793/nsurlsession-how-to-increase-time-out-for-url-requests'
    //'Client closed connection before receiving entire response'

    NSLog(@"urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest:%f", urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest);
    NSLog(@"urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource:%f", urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource);

    //was 60
    //urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest = 240.0;
    urlSessionConfigurationBACKGROUND_.timeoutIntervalForRequest = 600.0;
//    urlSessionConfigurationBACKGROUND_.timeoutIntervalForResource = 60.0;
person brian.clear    schedule 14.06.2017

Вы можете попросить своего помощника по серверу изменить тип контента на видео/mpeg4 или изменить тип запроса с GET на POST.

person NSKevin    schedule 28.06.2017