App mobile em segundo plano App suspended in background
ID da causa co-mobile-bg · Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
Se você tira o app da tela por um instante para ver uma notificação, o SO o suspende (suspend) alguns segundos depois e, nesse meio-tempo, o servidor desconecta você.
Por quê O jogador sai do jogo para ver uma mensagem ou atender uma ligação → Efeito A engine pausa o jogo, e logo depois o SO também suspende o app e a rede → Na tela Ao voltar, a conexão já caiu; é preciso reconectar
Depois de ficar parado, Ao fazer ações específicas
Responsável
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Cliente: ao voltar, sem esperar pela conexão que caiu, reconectar automaticamente na hora com o token de sessão (retomar sem novo login) e receber o estado mais recente de uma vez para se sincronizar. Servidor: quando os heartbeats param, encerrar a conexão, mas manter a sessão do personagem por um curto tempo de tolerância (sem expulsar na hora) e, se o jogador reconectar nesse prazo, retomar pelo token de sessão.
Números de referência
Em geral, a engine pausa no instante em que o app sai da tela. O iOS suspende o app em alguns segundos e, mesmo com tempo extra concedido, geralmente em algumas dezenas de segundos; no Android 14 ou superior, o app que saiu da tela é congelado (freeze) depois de uns 10 segundos.
No gráfico
Queda de conexões em massa · Desconexões (timeout de heartbeat), registros de suspensão do app
Onde olhar
Cruzar, pelo ID de sessão, os horários de suspensão e retorno do app no log do cliente (OnApplicationPause no Unity) com o motivo e o horário da desconexão no servidor. No Android, ver também o motivo de encerramento do processo registrado no ApplicationExitInfo (REASON_LOW_MEMORY etc.)
Confirma se
Logo antes da desconexão por timeout de heartbeat no servidor, o cliente entrou em suspensão e, logo depois de voltar, reconectou
Descarta se
Caiu com o app em primeiro plano: “Expiração do mapeamento NAT”, “IP compartilhado pela operadora (CGNAT)” ou “Troca Wi-Fi ↔ LTE/5G”
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Saiba mais
Quando falta memória, o celular às vezes encerra de vez o jogo que estava em segundo plano. É por isso que, depois de abrir a câmera ou um app de pagamento ou de autenticação, o jogo recomeça do zero. É mais comum em aparelhos mais fracos.
Fontes
Extending your app’s background execution timeApple Ao ir para segundo plano, o app recebe 5 s em applicationDidEnterBackground e logo é suspenso; se precisar de mais, pede tempo com beginBackgroundTask (o tempo restante fica em backgroundTimeRemaining)
Cached apps freezerAndroid (Google) No Android 14 ou superior, processos de apps em estado de cache são congelados após 10 s e, uma vez congelados, todas as suas threads param
Application.runInBackgroundUnity Com o padrão false, o jogo pausa em segundo plano; no Android, pausa em segundo plano independentemente da configuração, e o iOS ignora essa configuração
ApplicationExitInfoAndroid (Google) REASON_LOW_MEMORY: o low memory killer do sistema encerrou o processo do app (aparelhos sem suporte informam REASON_SIGNALED com SIGKILL)