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
Respostas:
Não tenho muita certeza, mas você pode usar profissionais de serviço. Tanto quanto eu sei, eles são executados em segundo plano, mesmo que a guia não seja aberta e são finalizados se a guia for fechada.
Btw. os ciclos de vida das guias do navegador parecem diferentes em todos os navegadores, pois cada navegador lida com isso de maneira diferente. Pelo que vejo, o navegador pode congelar guias se o navegador precisar de mais memória para outras coisas.
Aqui estão os documentos do Chrome .
Lembrei-me de que existem alguns eventos, como onload, que informam se um usuário saiu ou reabriu a guia. Você pode usar esses eventos para reconectar etc.
fonte
console.log()
quando receber mensagens do servidor ws. No chrome, você pode abrir o console do seu técnico de serviço e testar se as mensagens são recuperadas ao sair da guia.Eu daria conselhos diferentes sobre como criar seu aplicativo. Pelo que entendi, sua intenção é adicionar mais lógica para entender se o usuário não está mais ativo no navegador. Isso implica um problema diferente, que é específico do navegador para implementar essa lógica. Com isso em mente, eu investiria em um melhor tratamento de erros , tanto no servidor quanto no cliente.
Os erros não serão específicos do navegador. A manipulação dessas opções tornará seu aplicativo mais resiliente e independente das alterações do navegador, que poderão mudar, digamos, a maneira como hibernam uma guia, qualquer outro recurso que um fornecedor possa implementar no futuro.
Essa é uma ideia que você pode encontrar na arquitetura de serviços, mas o mesmo padrão se aplica a qualquer aplicativo Web. Você pode querer procurar
Design-for-Fail
conceitos:https://www.oreilly.com/library/view/designing-delivery/9781491903742/ch04.html
fonte