Если ненадолго свернуть игру, чтобы посмотреть уведомление, через несколько секунд ОС приостанавливает приложение (suspend), а сервер тем временем отключает игрока.
Почему Игру свернули, чтобы прочитать сообщение или ответить на звонок → Следствие Движок останавливает игровой цикл, а вскоре ОС приостанавливает и само приложение, и его сетевую активность → На экране По возвращении уже дисконнект и переподключение
Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: по возвращении сразу автоматически переподключаться по токену сессии, не дожидаясь старого соединения (продолжать без повторного входа), и разом получать актуальное состояние. Сервер: когда хартбиты прекращаются, закрывать соединение, но ещё недолго сохранять сессию персонажа (окно переподключения, без немедленного кика) и при переподключении в это окно подхватывать её по токену сессии.
Цифры для ориентира
Движок обычно останавливается в момент сворачивания. iOS приостанавливает приложение через несколько секунд, а если оно запросило дополнительное время, обычно в пределах десятков секунд. Android 14 и новее замораживает (freeze) ушедшее с экрана приложение примерно через 10 секунд.
На графике
Массовый обрыв соединений · число обрывов (таймаут хартбита), записи о приостановке приложения
Где смотреть
Сопоставить по ID сессии время приостановки и возврата приложения из лога клиента (в Unity OnApplicationPause) с причиной и временем обрыва на сервере. На Android смотреть также причину завершения процесса в ApplicationExitInfo (REASON_LOW_MEMORY и др.)
Подтверждает
Незадолго до обрыва по таймауту хартбита на сервере клиент ушёл в приостановку, а сразу после возврата переподключился
Опровергает
Если обрыв случился, пока приложение было на экране, это «Истечение записи в таблице NAT», «Общий IP провайдера (CGNAT)» или «Переключение Wi-Fi ↔ LTE/5G»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Если памяти не хватает, телефон может и вовсе завершить свёрнутую игру. Поэтому после перехода в камеру, приложение для оплаты или авторизации игра запускается заново. На слабых устройствах это бывает чаще.
Источники
Extending your app’s background execution timeApple При уходе в фон на applicationDidEnterBackground даётся 5 секунд, затем приложение приостанавливается. Если нужно больше, время запрашивают через beginBackgroundTask (остаток виден в backgroundTimeRemaining)
Cached apps freezerAndroid (Google) Android 14 и новее замораживает процесс приложения, перешедший в кэшированное состояние, через 10 секунд. После заморозки все потоки стоят
Application.runInBackgroundUnity По умолчанию false, и в фоне игра останавливается. На Android игра в фоне останавливается при любой настройке, iOS эту настройку игнорирует
ApplicationExitInfoAndroid (Google) REASON_LOW_MEMORY: процесс приложения завершён системным low memory killer (устройства без поддержки сообщают REASON_SIGNALED и SIGKILL)