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, така че синхронизирането ми да попадне в нещо като закачено състояние.

ИЗОБРАЖЕНИЕ: ОК ИЗТЕГЛЯНЕ: ПОТОЦИ НА ФИЛМИ И ЗАПАЗЕНИ НА ДИСКА: 200: Завършен

ИЗОБРАЖЕНИЕ:OK ИЗТЕГЛЯНЕ: ПОТОЦИ НА ФИЛМИ И ЗАПАЗЕНИ НА ДИСКА: 200: Завършено

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

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

Някакви идеи: Използвам Background Fetch, така че не съм сигурен дали клиентът в съобщението е 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

Можете да помолите вашия партньор на сървъра да промени типа на съдържанието на video/mpeg4 или можете да промените типа на вашата заявка от GET на POST

person NSKevin    schedule 28.06.2017