Swift iOS アプリでバックグラウンド移行時や復帰時のイベントで任意の処理を行う
iOS アプリでよくある、
- バックグラウンド移行時に何か処理をする
- フォアグラウンド復帰時に何か処理をする
を実現する方法のまとめ。
目次
- 環境情報
- 用意されているイベントの種類
- アプリ全体でイベント定義するには AppDelegate.swift を使う
- ViewController 内でイベントに反応するには NotificationCenter を使う
環境情報
- 対象 iOS バージョン : v11.3
- Xcode : v9.3 (9E145)
- Swift : v4.1 (swiftlang-902.0.48 clang-902.0.37.1)
用意されているイベントの種類
開発者が検知して利用できる主なイベントの種類は以下のとおり。
イベント名 | 概要 |
---|---|
application:willFinishLaunchingWithOptions | アプリ起動後 |
application:didFinishLaunchingWithOptions | アプリが画面を表示する直前 |
applicationDidBecomeActive | フォアグラウンド状態に切り替わる直前 |
applicationWillResignActive | フォアグラウンド状態から抜けようとしている時 |
applicationDidEnterBackground | バックグラウンド状態 (いつでも一時停止状態になりうる) |
applicationWillEnterForeground | バックグラウンド状態から抜けつつあるが、まだアクティブにはなっていない時 |
applicationWillTerminate | アプリが終了する時 |
この他にもいくつかイベントはあるが、とりあえず主なものだけ。
アプリ全体でイベント定義するには AppDelegate.swift を使う
アプリ全体でこれらのイベントを検知して利用するには、AppDelegete.swift
を使う。
アプリの雛形を生成した時に、既にこれらのイベントに対応するメソッドを持った状態でクラスが作成されているはずなので、コレをそのまま利用しよう。
ViewController 内でイベントに反応するには NotificationCenter を使う
ViewController 内でこれらのイベントに反応するには、viewDidLoad()
関数内で NotificationCenter を使ってイベント登録をしておくと良い。JavaScript で言うところの document.addEventListener()
的な意味合いだ。
例えば、アプリ起動時、およびフォアグラウンド復帰時に何か関数を実行したい場合は、以下のように設定すれば良い。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// アプリ起動時・フォアグラウンド復帰時の通知を設定する
NotificationCenter.default.addObserver(
self,
selector: #selector(ViewController.onDidBecomeActive(_:)),
name: NSNotification.Name.UIApplicationDidBecomeActive,
object: nil
)
}
// アプリ起動時・フォアグラウンド復帰時に行う処理
@objc func onDidBecomeActive(_ notification: Notification?) {
// ココに処理
}
}
NotificationCenter.default.addObserver()
でイベント定義。selector
に呼び出したい関数を指定する。name
がイベント名を設定するところだが、NSNotification.Name.
まで入力すると設定できるイベントを補完候補で表示してくれる。
登録したイベント (通知) を削除するには removeObserver()
を使えば良い。
- 参考 : アプリケーションのライフサイクル
- 参考 : Swift3.0 NotificationCenter を使ってアプリの状態に応じた処理を行う - JoyPlotドキュメント
- 参考 : ObjC memo applicationDidBecomeActive の実行タイミングメモ … 操作内容に応じて発火するイベントがまとめられている
- 参考 : アプリが非アクティブになったことをViewControllerで検知する方法 UIApplicationDelegate - MILLEN BOX
- 参考 : iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する - A Day In The Life
- 参考 : Swift 起動時、終了時、アクティブになったときなどにメソッドを呼ぶ方法