контекст
Игра поставляется в виде прогрессивного веб-приложения, которое имеет таймеры ( setTimeout
, setInterval
) и соединения с веб- сокетами для связи в реальном времени.
Что происходит
Все хорошо, пока пользователь остается в приложении. Но когда пользователь переходит на другую вкладку, другое приложение или выключает экран (в случае с мобильным), он становится «адским неизвестным миром».
- Веб-сокеты могут или не могут стать "приостановленным" или "выключенным"
- Таймеры выглядят так, как будто их душат или дебютируют.
Такое поведение, похоже, зависит от браузеров и платформы и, возможно, даже зависит от конкретного поведения пользователя. Я предполагаю, что браузеры и ОС имеют свой собственный жизненный цикл / механизмы для экономии заряда батареи и / или вычислений.
Когда пользователь возвращается, приложение находится в неизвестном состоянии, и я изо всех сил пытаюсь восстановить его правильно.
Что касается веб-сокетов, у меня есть автоматическое переподключение с socket.io и повторное подключение веб-сокета, но этого недостаточно, чтобы решить все.
Ищу ответы
- Каковы «жизненные циклы» различных браузеров в отношении этих? Это задокументировано? Когда они решают выключить и включить газ?
- Что они делают именно с веб-сокетами? Браузеры просто их отключают?
- Что они делают именно с таймерами? Они их душат, или отговаривают, или что-то еще?
- Что происходит с исполнением JavaScript в целом? Приостановлено / уничтожено / задушено?
- Есть ли способ подключиться к какому-то событию жизненного цикла браузера, когда оно отключится? Единственное, что я могу найти, это API видимости.
Есть ли способ искусственно воспроизвести это поведение, чтобы иметь возможность тестировать решения? Это особенно сложно на рабочем столе. Веб-сокеты нельзя отключить, и разработчики Chromium не спешат помочь с проблемой 2014 года (!): Веб-сокеты не включены при использовании регулирования соединения
Независимо от вышесказанного, существует ли прагматичное кросс-браузерное решение для обнаружения / решения этой проблемы? (например, из опыта, Firefox на рабочем столе, кажется, ведет себя совершенно иначе, чем Chrome, и iPhone будет отключаться гораздо чаще, чем Android)
Ссылки по теме