21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-03

#背景
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
    }

...

}
21
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?