【Swift UIKit】UIApplicationDelegateを使ってライフサイクルを管理する方法

UIApplicationDelegateでは、iOSアプリケーションのライフサイクルイベントに対する処理を行うことが出来ます。

アプリの起動、終了、アクティブになったとき、非アクティブになったときにそれぞれ指定の処理を実行できます。

スポンサーリンク

UIApplicationDelegateで出来ること

  • アプリケーションの初期化
  • Sceneの設定
  • アプリの外部から発信される通知への対応
    • メモリ不足警告
    • ダウンロード完了通知など
  • アプリ自体をターゲットとしたイベントへの応答
  • Apple Push Notificationサービスなど、起動時に必要なサービスへの登録

起動したとき【application(_:didFinishLaunchingWithOptions:)】

アプリケーションが起動した直後に実行される処理です。

初期化や設定のためのコードをここに記載します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // アプリケーション起動時の初期化や設定の処理
    return true
}

非アクティブになる直前になったとき【applicationWillResignActive(_:)】

アプリケーションが非アクティブになる直前に実行される処理です。

電話がかかってきたときやホームに戻ったときなどで実行されます。

func applicationWillResignActive(_ application: UIApplication) {
    // アプリケーションが非アクティブになる前の処理
}

バックグラウンドに移行したとき【applicationDidEnterBackground(_:)】

アプリケーションがバックグラウンド状態に移行ときに実行されます。

func applicationDidEnterBackground(_ application: UIApplication) {
    // アプリケーションがバックグラウンドに移行した際の処理
}

画面表示する直前になったとき【applicationWillEnterForeground(_:)】

アプリケーションがフォアグラウンド アクティブ状態に移行する直前(画面表示する直前)に実行されます。

func applicationWillEnterForeground(_ application: UIApplication) {
    // アプリケーションがフォアグラウンドに戻る直前の処理
}

アクティブになったとき【applicationDidBecomeActive(_:)】

アプリケーションがアクティブ状態になった直後に実行されます。

sceneを利用しているときはこの処理は行われません。

func applicationDidBecomeActive(_ application: UIApplication) {
    // アプリケーションがアクティブになった直後の処理
}

終了する直前になったとき【applicationWillTerminate(_:)】

アプリケーションが終了する直前になったときに実行されます。

func applicationWillTerminate(_ application: UIApplication) {
    // アプリケーションが終了する直前の処理
}

起動後、初期化前になったとき【application(_:willFinishLaunchingWithOptions:)】

アプリケーションが起動した直後かつ、初期化処理の前に実行されます。

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // アプリケーション起動前の処理
    return true
}

メモリ不足が発生しているとき【applicationDidReceiveMemoryWarning(_:)】

メモリが不足しているときに実行されます。

通常、メモリ解放処理等を記載します。

func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
    // メモリが不足している場合の処理
}

URLスキーム経由などで開いたとき【application(_:open:options:)】

他のアプリからファイルを受け取ったときURLスキーム経由で開かれたときに実行されます。

func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // アプリが他のアプリからファイルを受け取ったり、URLスキーム経由で開かれた場合の処理
    return true
}

新しくsceneを作成したとき【application(_:configurationForConnecting:options:)】

新しくsceneが作成されたときに実行されます。初期化処理を実行するのに向いています。

func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
    // 新しくsceneが作成されたとき
    return true
}

sceneが破棄されたとき【application(_:didDiscardSceneSessions:)】

sceneが破棄されたときに実行されます。

func application(UIApplication, didDiscardSceneSessions: Set<UISceneSession>) {
    // sceneが削除されたとき
}

アクティブ状態になったとき【didBecomeActiveNotification】

アプリケーションがアクティブ状態になった時通知します。

この通知はNotificationCenterを通じて受け取りアクティブになったときに必要な処理を実行するのに利用されます。

import UIKit

class MyAppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // アプリケーション起動時の初期化や設定の処理
        return true
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // アプリケーションがアクティブになった直後の処理
        // 例: データの更新やユーザーインタラクションの復元
    }

    // 他のUIApplicationDelegateメソッドもここに続く...

    // NotificationCenterを使用してdidBecomeActiveNotificationを購読
    func subscribeToDidBecomeActiveNotification() {
        NotificationCenter.default.addObserver(self, selector: #selector(handleDidBecomeActiveNotification), name: UIApplication.didBecomeActiveNotification, object: nil)
    }

    // didBecomeActiveNotification通知に対する処理
    @objc func handleDidBecomeActiveNotification() {
        // 通知が発生したときの処理
    }

    deinit {
        // オブザーバーを解除する
        NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
    }
}

上記例では、applicationDidBecomeActive(_:)メソッドでアクティブになった際の処理を行っています。

また、subscribeToDidBecomeActiveNotification()メソッドでdidBecomeActiveNotificationを購読し、その通知が発生したときにhandleDidBecomeActiveNotification()メソッドが呼ばれるように設定しています。

通知を受け取る場合は、解放時にオブザーバーを解除してください。

バックグラウンド状態になったとき【didEnterBackgroundNotification】

アプリケーションがバックグラウンド状態になった時通知します。

この通知はNotificationCenterを通じて受け取りバックグラウンドになったときに必要な処理を実行するのに利用されます。

import UIKit

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // NotificationCenterにオブザーバーを登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(appDidEnterBackground),
                                               name: UIApplication.didEnterBackgroundNotification,
                                               object: nil)
    }

    // バックグラウンドに移行したときに呼ばれるメソッド
    @objc func appDidEnterBackground() {
        print("アプリがバックグラウンドに移行しました。")
        // ここに適切な処理を追加
    }

    deinit {
        // オブザーバーの解除
        NotificationCenter.default.removeObserver(self)
    }
}

上記例では、appDidEnterBackground(_:)メソッドでアクティブになった際の処理を行っています。

通知を受け取る場合は、解放時にオブザーバーを解除してください。

フォアグラウンド状態(画面表示)になるとき【willEnterForegroundNotification】

アプリケーションがバックグラウンド状態からフォアグラウンド状態(画面表示)状態になる時通知します。

この通知はNotificationCenterを通じて受け取りフォアグラウンドになったときに必要な処理を実行するのに利用されます。

例えば、バックグラウンドに移行する前に保存しておく必要があるデータがある場合、この通知を利用して適切な処理を行うことができます。

import UIKit

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // NotificationCenterにオブザーバーを登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(appWillEnterForeground),
                                               name: UIApplication.willEnterForegroundNotification,
                                               object: nil)
    }

    // フォアグラウンドに移行する直前に呼ばれるメソッド
    @objc func appWillEnterForeground() {
        print("アプリがフォアグラウンドに移行する直前です。")
        // ここに適切な処理を追加
    }

    deinit {
        // オブザーバーの解除
        NotificationCenter.default.removeObserver(self)
    }
}

上記例では、appWillEnterForeground(_:)メソッドでフォアグラウンドになった際の処理を行っています。

通知を受け取る場合は、解放時にオブザーバーを解除してください。

非アクティブ状態になるとき【willEnterForegroundNotification】

アプリケーションが非アクティブ状態になる時通知します。

この通知はNotificationCenterを通じて受け取り非アクティブになったときに必要な処理を実行するのに利用されます。

例えば、電話がかかってきたり、通知が表示されるなどの要因で一時的に中断される場合に、この通知を利用して適切な処理を行うことができます。

import UIKit

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // NotificationCenterにオブザーバーを登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(appWillResignActive),
                                               name: UIApplication.willResignActiveNotification,
                                               object: nil)
    }

    // アプリケーションが非アクティブになる直前に呼ばれるメソッド
    @objc func appWillResignActive() {
        print("アプリが非アクティブになる直前です。")
        // ここに適切な処理を追加
    }

    deinit {
        // オブザーバーの解除
        NotificationCenter.default.removeObserver(self)
    }
}

上記例では、appWillResignActive(_:)メソッドで非アクティブになった際の処理を行っています。

通知を受け取る場合は、解放時にオブザーバーを解除してください。

終了するとき【willTerminateNotification】

アプリケーションがユーザーによって終了されるか、システムによって終了される時通知します。

この通知はNotificationCenterを通じて受け取り終了するときに必要な処理を実行するのに利用されます。

アプリが非アクティブで、終了する可能性が高い状態になると通知されます。

import UIKit

class YourAppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // アプリケーションが起動した際の初期設定などを行う
        return true
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // アプリケーションが終了する直前に呼ばれるメソッド
        print("アプリが終了する直前です。")
        // ここに適切な終了処理を追加
    }
    
    deinit {
        // オブザーバーの解除
        NotificationCenter.default.removeObserver(self)
    }
}

上記例では、applicationWillTerminate(_:)メソッドで終了する際の処理を行っています。

通知を受け取る場合は、解放時にオブザーバーを解除してください。

コメント

タイトルとURLをコピーしました