Contexto
Un juego enviado como una aplicación web progresiva que tiene temporizadores ( setTimeout
, setInterval
) y conexiones websocket para obtener comunicación en tiempo real.
Qué está pasando
Todo está bien mientras el usuario permanezca en la aplicación. Pero cuando el usuario va a otra pestaña, u otra aplicación o apaga la pantalla (en el caso de los dispositivos móviles), se convierte en un "mundo desconocido infernal".
- Websockets puede o no "pausarse" o "apagarse"
- Parece que los temporizadores están siendo estrangulados o rebotados.
Este comportamiento parece depender de los navegadores y la plataforma y, tal vez, incluso depende del comportamiento particular del usuario. Supongo que los navegadores y el sistema operativo tienen su propio ciclo de vida / mecanismos para ahorrar batería y / o computación.
Cuando el usuario regresa, la aplicación se encuentra en un estado desconocido y estoy luchando por restaurar el estado correctamente.
En cuanto a los websockets, tengo una reconexión automática con socket.io y reconectando-websocket, pero no es suficiente para resolver todo.
Buscando respuestas
- ¿Cuáles son los "ciclos de vida" de los diferentes navegadores con respecto a estos? ¿Está esto documentado? ¿Cuándo deciden apagarse y acelerar?
- ¿Qué hacen exactamente a los websockets? ¿Los navegadores simplemente los desconectan?
- ¿Qué hacen exactamente a los temporizadores? ¿Los estrangulan o los rechazan o algo más?
- ¿Qué sucede con la ejecución de JavaScript en general? ¿Pausado / destruido / estrangulado?
- ¿Hay alguna manera de conectarse a algún tipo de evento de ciclo de vida del navegador cuando va a apagar las cosas? Lo único que podría encontrar podría ser la API de visibilidad
¿Hay alguna manera de reproducir artificialmente este comportamiento para poder probar soluciones? Es especialmente difícil en el escritorio. Los WebSockets no se pueden desactivar y los desarrolladores de Chrome no parecen tener prisa para ayudar con un problema de 2014 (!): Los WebSockets no se incluyen cuando se usa la limitación de la conexión
Independientemente de lo anterior, ¿existe una solución pragmática de navegador cruzado para detectar / resolver este problema? (por ejemplo, por experiencia, Firefox en el escritorio parece comportarse completamente diferente en comparación con Chrome, y un iPhone se desconectará con mucha más frecuencia que un Android)
enlaces relacionados