Интервал ожидания сеанса конфигурации не может быть установлен более 60 секунд - PullRequest
0 голосов
/ 12 марта 2019

В моем приложении данные, которые я получаю с сервера, довольно тяжелые и представляются в виде Bulk Data в одном API.Из-за этого я увеличил интервал ожидания до 1800 секунд.Мой код:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.mobiletuts.Singlecast.BackgroundSession"];
        // Session Configuration
        [sessionConfiguration setTimeoutIntervalForRequest:30*60];
        // Initialize Session
        session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];

NSMutableURLRequest* request = [[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:fdi.downloadSource]] mutableCopy];
    request = [CommonFunctions AddRequestHeaders:request];
    [request setTimeoutInterval:30*60];
    fdi.downloadTask = [self.session dataTaskWithRequest:request];
    [fdi.downloadTask resume];

Даже мой сеанс показывает время ожидания 1800 секунд, но я получаю время ожидания запроса через 60 секунд.Как я могу увеличить время ожидания, чтобы мы не получили время ожидания запроса?

1 Ответ

1 голос
/ 13 марта 2019

Краткий ответ? Вы не можете и не должны пытаться.

Когда устройство iOS ожидает данных с открытым подключением к вашему серверу, его сетевое оборудование (Wi-Fi или сотовая связь) включается, используя драгоценную батарею. По этой причине существуют ограничения на то, как долго вы сможете поддерживать аппаратное обеспечение горячим в ожидании поступления данных.

В вашем случае ваш сервер не отправляет ни одного байта данных более чем на целую минуту. Просто не разумно ожидать, что HTTP / HTTPS-запрос останется живым в течение такого длительного периода бездействия.

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

Так что, если ваш сервер действительно работает в течение 60 с лишним секунд, не отправляя ни одного байта данных, вам необходимо полностью переосмыслить то, как вы работаете, и разделить запрос на два вызова:

  • Генерация данных - Скажите серверу начать обработку данных, чтобы подготовить их к загрузке вашим приложением.
  • Получить данные - спросите у сервера, готовы ли еще данные, и если да, извлеките их (и, при необходимости, очистите или выполните это с помощью отдельного запроса).

Сделайте первый запрос, затем периодически повторяйте второй запрос (скажем, раз в минуту), пока он не вернет данные.

Не забудьте добавить какой-нибудь серверный скрипт для очистки любых сгенерированных данных, которые не были востребованы по прошествии некоторого времени (день, неделя и т. Д.), Чтобы они не просто складывались вверх навсегда.

Если вы не ожидаете, что ваш сервер не будет отправлять какие-либо данные в течение такого длительного периода времени, вам следует потратить некоторое время на выяснение того, что не так на стороне сервера.

...