Как отследит «сон» у webview и подобных технологий?
В общем есть приложение для Android и IOS, точнее просто браузер webview в обёртке. На сайте есть сокет, который на лету выводит всем пользователям информацию, работает это отлично, если приложение открыто.
НО если приложение свёрнуто или телефон заблокирован (но приложение открыто), то данные добавляются на сайт минут 2-3 и всё, после если открыть приложение, то начинаются добавляться новые, а старый не добавились в периоде «сна».
Сначала я предположил, что браузер закрывает соединение с сокетом, включил логи, но нет. Сокет остаётся открытым.
Значит JS перестаёт выполняться, видимо ради экономии...
В общем как вообще можно отследить это состояние, чтобы после открытия приложения я бы мог выполнить запрос на обновление ленты с информацией?
пишу в комментах, а не в ответах, потому что давно не брал в руки шашку и могу уже ошибаться или чтото не знать
==
сдается мне что единого и 100% рабочего решения не будет, просто потому что есть полно телефонов у которых 'сон' реализован в т.ч. в обход системных механизмов
Помню...уже много лет назад во времена 4-5 версий андройда, сталкивался с тем что даже штатное явовское приложение засыпало намертво на телефоне lenovo несмотря на любые флаги, настройки и параметры, при этом не генерировалось никаких событий или алертов чтобы это отслеживать...это типа такая экономия энергии по китайски
На более современных телефонах я такое встречал у xiaomi..но тут это хоть както отключать можно....а учитывая разношерстность телефонов и прошивок то прям руки опускаются
Игорь, Ну в таком случаи, мне не понятно как реализовано это допустим в мессенджере ВК, там при пробуждении они успешно обновляют чат. Но как это они делают по js коду не могу понять.
вот у меня мысль появилась (просто виртуально)
запоминаем каждые 1 мин отметку времени и постоянно проверяем что она не старше 1 минуты
если внезапно дельта больше 1 минуты - оп, мы оказывается спали, делаем то что нам надо, обновляем/отправляем
Странно, по уму сокет должен закрыться и открыться заново, если пройдет таймаут (он и для сервера и для клиента есть, не помню, можно ли его менять в браузере) или отправленные данные так и не дошли до клиекнта (полагаю в браузере время работы во сне создано специально для этого), но в 99% случаев на клиенте все ставят логику автоматического пересоздания этого сокета. Если сокет не был пересоздан, значит данных в канале новых нет, это смысл tcp протокола, отправленные данные либо дойдут либо будет ошибка но никак не их потеря.
и в этот самый момент, когда сокет открывается, на сервере должен быть функционал запроса либо всего текущего состояния, либо разницы, накопившейся с момента последнего подключения.
Сокет точно не прерывается, в логах данные уходят, в дебагере соединение живёт и данные поступает, а вот обработка данных на стороне js не происходит. Если открыть на устройстве приложение, то сокет не переподключается, а дальше принимает данные, как-будто ничего и не было. Меня вот это вот и смутило...