ゲームラグ白書 › L2 クライアントのOS・端末
モバイルアプリのバックグラウンド移行 App suspended in background
原因ID co-mobile-bg · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
通知を見ようとアプリをいったんバックグラウンドに移すと、OSが数秒後にアプリを一時停止(suspend)し、その間にサーバーは自分を切断します。
なぜ メッセージの確認・電話でゲームをバックグラウンドに移す → すると ゲームエンジンがゲームの進行を止め、OSもすぐにアプリとネットワークを停止させる → 画面では 戻るとすでに切断されていて、再接続
- 症状
- 切断
- 要因
- ストール, パケットロス
- 誰に起きるか
- 自分だけ
- いつ
- しばらく放置した後, 特定の操作をしたとき
- 担当
- 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- クライアント:戻ったら切れた接続を待たずに、セッショントークンですぐに自動再接続(再ログインなしで接続を引き継ぐ)、最新の状態を一度に受け取って合わせる。サーバー:ハートビートが途切れたら接続は片付けるが、キャラクターのセッションは短い猶予時間のあいだ維持(すぐに追い出さない)、その間に再接続すればセッショントークンで引き継ぐ。
- 数値の目安
- ゲームエンジンは通常、バックグラウンドに移した瞬間に止まります。iOSは数秒、追加の時間をもらってもたいてい数十秒以内にアプリを一時停止し、Android 14以降は画面から外れたアプリを10秒ほどで凍結(freeze)します。
- グラフでは
- 接続が一斉に切れる · 切断数(ハートビートのタイムアウト)、アプリの一時停止の記録
- 確認箇所
- クライアントログにあるアプリの一時停止・復帰の時刻(UnityではOnApplicationPause)と、サーバーの切断理由・時刻を、セッションIDで突き合わせる。Androidは、ApplicationExitInfoに残ったプロセスの終了理由(REASON_LOW_MEMORYなど)もあわせて確認
- 該当する場合
- サーバーのハートビートタイムアウトによる切断の直前にクライアントが一時停止に入り、復帰直後に再接続している
- 該当しない場合
- アプリをフォアグラウンドにしている間に切れたなら「NATマッピングの期限切れ」「通信事業者の共有IP(CGNAT)」「Wi-Fi ↔ LTE・5Gの切り替え」
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
- もっと詳しく
- スマホはメモリが足りないと、バックグラウンドのゲームを完全に終了させることもあります。カメラや決済・認証アプリから戻るとゲームが最初から起動し直すのはこのためです。低スペックの端末ほどよく起きます。
出典
- Extending your app’s background execution time Apple
バックグラウンドに移るとapplicationDidEnterBackgroundに5秒が与えられ、すぐに一時停止。さらに必要ならbeginBackgroundTaskで時間を要求(残り時間はbackgroundTimeRemaining) - Cached apps freezer Android (Google)
Android 14以降は、キャッシュ状態になったアプリのプロセスを10秒後に凍結し、凍結されるとすべてのスレッドが止まる - Application.runInBackground Unity
デフォルト値のfalseではバックグラウンドで止まる。Androidはバックグラウンドなら設定にかかわらず止まり、iOSはこの設定を無視 - MonoBehaviour.OnApplicationPause(bool) Unity
アプリが一時停止されたり再開されたりするとき、すべてのMonoBehaviourにOnApplicationPause(true/false)を送る - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY:システムの低メモリキラーがアプリのプロセスを終了させた(非対応の端末ではREASON_SIGNALED・SIGKILLとして報告)
あわせて読みたい原因
同じ層:L2 クライアントのOS・端末
同じ症状(切断)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る