[Swift3.0] NotificationCenter を使ってアプリの状態に応じた処理を行う

2016年11月1日(更新: 2017年9月15日)

NotificationCenter を使って、アプリの状態がバックグラウンドになった時や、フォアグラウンド(アクティブ)に戻った時などに特定の処理を行わせる方法です。

アプリの状態に応じて呼び出されるメソッド

プロジェクト作成時に自動的に作られる AppDelegate.swift には、アプリケーションの状態に応じて呼び出される以下の5つのメソッドがあらかじめ定義されています。

    func applicationWillResignActive(_ application: UIApplication) {
        // アプリの状態がバックグラウンドになろうとする時
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // アプリの状態がバックグラウンドになった時
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // アプリの状態がバックグラウンドから戻ってくる時
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // アプリの状態がアクティブになった時
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // アプリが終了する時
    }

これらのメソッドは、上記のタイミングで自動的に呼び出されます。ここで処理を行っても良いのですが、別の ViewController などのクラス内で処理を行いたい場合もあります。

アプリケーションの状態が変わったことを AppDelegate.swift 以外で感知して処理を行いたい場合は、NotificationCenterNSNotificationCenter)を使って通知を送信するようにします。

NotificationCenter の使用例

例えば、アプリがバックグラウンドからフォアグラウンドになる時に、ある処理を ViewController.swift で行わせたいという場合は、viewDidLoad などに以下のコードを書きます。

NotificationCenter.default.addObserver(
  self, 
  selector: #selector(self.foreground), 
  name: NSNotification.Name.UIApplicationWillEnterForeground, 
  object: nil
)

第2引数(selector)に、通知を受け取った時に呼び出すメソッドを、第3引数(name)に受け取る通知の名前を指定します。

これだけでアプリの状態がフォアグラウンドになった際、foreground という名前のメソッド(これは自分で用意します)を呼び出すことができます。

あらかじめ用意された通知を受け取る

NSNotification.Name には、あらかじめシステム側で用意された通知の名前が登録されています。

例えば、アプリがバックグラウンドになった際に、クラス内にある test というメソッドを呼び出したいという場合は、以下のように UIApplicationDidEnterBackground を指定します。

NotificationCenter.default.addObserver(
  self, 
  selector: #selector(self.test), 
  name: NSNotification.Name.UIApplicationDidEnterBackground, 
  object: nil
)

NSNotification.Name. とタイプすると候補が表示されますので、どのようなタイミングで通知が受け取れるか調べてみるといいでしょう。

NSNotification.Name に登録された通知の種類

オリジナルの通知を登録する

自分で通知を送信するタイミングや、通知の名前を設定することもできます。

オリジナルの通知を登録するには、以下のように、通知の送信を行いたい部分で NotificationCenter のメソッド post を呼び出します。

func post(name aName: NSNotification.Name, object anObject: Any?)

第1引数に通知の名前を、第2引数に通知の送信者となるオブジェクトを指定します。以下は通知にオリジナルの名前「myNotification」を付けて登録する例です。

// test という名前を付けた通知を登録する例
NotificationCenter.default.post(name: NSNotification.Name("myNotification"), object: self)

この通知を受け取る場合は、先ほどの例と同様に addObserver を使います。myNotification という名前の通知を受け取って、クラス内のメソッド test を呼び出すには以下のようにします。

NotificationCenter.default.addObserver(
  self, 
  selector: #selector(self.test), 
  name: NSNotification.Name("myNotification"), 
  object: nil
)

これを利用すれば、好きなタイミングであるクラス内の処理を呼び出したりといったことが可能になります。

通知の解除

NotificationCenter に登録した通知の受け取りをやめる場合は removeObserver を使います。

クラスを使わなくなる際に通知を解除したい場合は deinit 内に書くといいでしょう。

    deinit {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
    }

以上が NotificationCenter による通知の設定方法です。

[Swift3.0] NotificationCenter を使ってアプリの状態に応じた処理を行う」への1件のフィードバック

  1. ピンバック: キーボードで入力欄が隠れないように対応[Swift4] | Let's enjoy programming !

コメントを残す

メールアドレスが公開されることはありません。