Contexto
Um jogo enviado como um aplicativo da web progressivo que possui timers ( setTimeout
, setInterval
) e conexões de soquete da web para obter comunicação em tempo real.
O que está acontecendo
Tudo está bem desde que o usuário permaneça no aplicativo. Mas quando o usuário acessa outra guia ou outro aplicativo ou desliga a tela (no caso de dispositivos móveis), ele se torna um "mundo desconhecido infernal".
- Os Websockets podem ou não ficar "em pausa" ou "desativados"
- Os temporizadores parecem estar sendo regulados ou debulhados.
Esse comportamento parece depender de navegadores e plataforma e, talvez, até depender do comportamento específico do usuário. Eu acho que navegadores e sistemas operacionais têm seu próprio ciclo de vida / mecanismos para economizar bateria e / ou computação.
Quando o usuário volta, o aplicativo está em um estado desconhecido e estou lutando para restaurar o estado corretamente.
Em relação aos websockets, tenho reconexão automática com socket.io e reconexão com websocket, mas não basta resolver tudo.
Procurando respostas
- Quais são os "ciclos de vida" dos diferentes navegadores em relação a esses? Isso está documentado? Quando eles decidem desligar e acelerar?
- O que eles fazem exatamente nos websockets? Navegadores apenas os desconectam?
- O que eles fazem exatamente com os temporizadores? Eles os estrangulam ou denunciam ou algo mais?
- O que acontece com a execução de javascript em geral? Pausado / destruído / regulado?
- Existe uma maneira de conectar-se a algum tipo de evento do ciclo de vida do navegador quando ele desativa as coisas? A única coisa que encontrei pode ser a API de visibilidade
Existe uma maneira de reproduzir artificialmente esse comportamento para poder testar soluções? É especialmente difícil na área de trabalho. Os Websockets não podem ser desativados e os desenvolvedores de cromo não parecem ter pressa para ajudar um problema a partir de 2014 (!): Os Websockets não estão incluídos ao usar a otimização de conexão
Independentemente do exposto, existe uma solução pragmática entre navegadores para detectar / resolver esse problema? (por exemplo, por experiência, o Firefox na área de trabalho parece se comportar completamente diferente em comparação com o Chrome e um iPhone será desconectado com muito mais frequência do que um Android)
Links Relacionados