iOS
Swift

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: Notification.Name.UIApplicationDidFinishLaunching, object: nil)

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

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

        // アプリ終了時
        NotificationCenter.default.addObserver(self, selector: #selector(self.willTerminate),
                                               name: Notification.Name.UIApplicationWillTerminate, 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
    }

...

}