Help us understand the problem. What is going on with this article?

NotificationCenterを用いたライフサイクルイベントの検知

背景

iOSアプリの起動、終了、バックグラウンドへの移行、フォアグラウンドへの復帰等のライフサイクルイベントを検知するには、AppDelegateクラスの各メソッドを利用するのが最も簡単な方法です。ただし、何らかの理由によりそれ以外の方法が求められる場合があります。例えばアプリではなくSDKの開発において、それらのイベントを検知したい場合等です。そういった場合、NotificationCenterを利用することによりアプリの起動や終了といったイベントを検知し、それに伴った処理を実装することが可能です。

ライフサイクル監視用のクラスを作成

下記のようにイベント検知用のクラスを作成し、NotificationCenterに自身のメソッドを登録してイベントを検知できるようにします。その際、オブジェクトをシングルトンとして使用できるよう、sharedInstanceの指定とprivate初期化メソッドの定義を行います。

class AppEventHandler: NSObject {
    static let sharedInstance = AppEventHandler()

    override private init() {
        super.init()
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    // 各イベントの通知を受け取れるよう、NotificationCenterに自身を登録
    func startObserving() {
        // アプリ起動時
        NotificationCenter.default.addObserver(self, selector: #selector(self.didFinishLaunch),
                                               name: UIApplication.didFinishLaunchingNotification, object: nil)

        // フォアグラウンド復帰時
        NotificationCenter.default.addObserver(self, selector: #selector(self.willEnterForeground),
                                               name: UIApplication.willEnterForegroundNotification, object: nil)

        // バックグラウンド移行時
        NotificationCenter.default.addObserver(self, selector: #selector(self.didEnterBackground),
                                               name: UIApplication.didEnterBackgroundNotification, object: nil)

        // アプリ終了時
        NotificationCenter.default.addObserver(self, selector: #selector(self.willTerminate),
                                               name: UIApplication.willTerminateNotification, object: nil)
    }

    // アプリ起動時の処理
    @objc func didFinishLaunch() {
    }

    // フォアグラウンドへの復帰時の処理
    @objc func willEnterForeground() {
    }

    // バックグラウンドへの移行時の処理
    @objc func didEnterBackground() {
    }

    // アプリ終了時の処理
    @objc func willTerminate() {
        // NotificationCenterから自身を削除
        NotificationCenter.default.removeObserver(self)
    }
}

使用方法

下記のようにAppDelegateクラスのdidFinishLaunchingWithOptionsメソッドにて監視を開始することで、以降はアプリの終了やフォアグラウンド復帰といったタイミングで通知を受け取ることができます。

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        AppEventHandler.sharedInstance.startObserving()

        return true
    }

...

}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away