Unity×iOS

【Unity×iOS】アプリの非表示・再表示を検知する方法まとめ|OnApplicationPauseとFocusの使い分け&サンプル付き

使用環境

・Unity Editor:2021.3.18f1

この記事で分かること

  • iOSアプリのライフサイクル(フォアグラウンド・バックグラウンド)とは?
  • Unity標準のイベントで非表示・再表示を検知する方法
  • コピペOK!OnApplicationPauseとOnApplicationFocusの使い分け
  • よくある落とし穴と実装時の注意点

iOSの非表示・再表示・バックグラウンドとは?

ピッグダディ

UnityでiOSアプリを作っていて、「アプリがホームに戻ったとき」「戻ってきたとき」にうまく制御したいって思ったことありませんか?

ピッグボーイ

あります!
戻ってきた時に強制的にタイトル画面に飛んだりして困ってました。

ピッグガール

勝手に再ログインとかされると、ユーザーも離れていきますよね…

ピッグダディ

その通りです。
この記事では、アプリのバックグラウンド移行・復帰をUnityで検知する方法を紹介します。
コピペで使えるサンプルコードと、iOS特有の注意点も解説するので、初心者でも安心して実装できますよ!

iOSアプリのライフサイクルとは?

iOSアプリは、次のようなライフサイクルで状態が切り替わります。

状態説明
フォアグラウンド画面に表示され、操作可能な状態
バックグラウンド非表示状態だが一時的にメモリ上に存在
サスペンドメモリにも存在せず停止寸前状態(iOS管理)

ユーザーがホームボタン(もしくはスワイプ)でアプリを閉じたり、別アプリに切り替えた時に、バックグラウンド→再表示(復帰)が発生します。

これをUnityで検知できれば、

  • ゲームを一時停止したり
  • データのオートセーブをしたり
  • ネットワークセッションを切断したり など、ユーザー体験の向上に繋げることができます!

Unity標準のイベントで非表示・再表示を検知する

Unityには、アプリ状態の変化を検知できる標準イベントが2つ用意されています。

OnApplicationPause(bool pauseStatus)

  • pauseStatus == true ならアプリがバックグラウンドへ移行
  • pauseStatus == false ならアプリがフォアグラウンド復帰
void OnApplicationPause(bool pauseStatus)
{
    if (pauseStatus)
    {
        Debug.Log("アプリがバックグラウンドに入りました");
    }
    else
    {
        Debug.Log("アプリがフォアグラウンドに復帰しました");
    }
}

ほとんどのケースでは、これだけで十分です!

OnApplicationFocus(bool hasFocus)

  • hasFocus == true なら操作可能な状態
  • hasFocus == false なら外れた状態(例えばコールが来た時なども)
void OnApplicationFocus(bool hasFocus)
{
    if (hasFocus)
    {
        Debug.Log("アプリにフォーカスが戻りました(操作可能)");
    }
    else
    {
        Debug.Log("アプリからフォーカスが外れました");
    }
}

注意点:
OnApplicationFocusは単純なバックグラウンド移行以外にも反応するため、
確実に「非表示→再表示」を検知したいなら、OnApplicationPauseを使う方が安全です。

【コピペOK】バックグラウンド検知スクリプト

このスクリプトを、シーンに存在するどこかのGameObjectにアタッチしておけばOK!

using UnityEngine;

public class AppLifecycleHandler : MonoBehaviour
{
    private void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
            Debug.Log("バックグラウンドへ移行");
            // 例)自動セーブ、ネットワーク切断
        }
        else
        {
            Debug.Log("フォアグラウンドに復帰");
            // 例)データ再ロード、ネットワーク再接続
        }
    }

    private void OnApplicationFocus(bool hasFocus)
    {
        Debug.Log($"アプリフォーカス状態: {(hasFocus ? "取得" : "喪失")}");
        // ※通知表示後など、細かい制御が必要ならこちらも併用
    }
}

よくある落とし穴と注意点

問題解説対策
通知バナーが出たときにもOnApplicationFocusが呼ばれるフォーカス喪失だけでは必ずしも「非表示」とは限らないOnApplicationPause中心で管理する
アプリ復帰直後にシーン遷移してしまう状態復帰タイミングで別処理が動くと不具合の原因に1フレーム遅らせる or フラグ管理
iOSのタスクキル(完全終了)時は検知できないアプリが生きていないため通知されないバックグラウンド復帰だけに絞って設計する

まとめ

ポイント内容
アプリ非表示・再表示はUnity標準イベントで検知可能OnApplicationPause(bool) を活用
iOSではバックグラウンド復帰管理が重要自動セーブ、ネット切断/再接続に応用
OnApplicationFocusは補助的に使う細かいUXチューニングに便利

iOS向けUnityアプリでは、非表示・再表示イベントを正しく処理することがユーザー満足度に直結します!
ぜひ今回紹介したテクニックを、あなたのアプリに取り入れてみてください。