iOS의 앱 라이프 사이클(App Life Cycle)

앱 사용 시 문자와 전화처럼 예기치 못한 상황 또는 사용자의 고의/실수로 앱을 종료하거나 백그라운드 등으로 전환하는 시점에 운영체제가 자동으로 호출하는 함수(메서드)들이 존재하며, 이러한 메서드 실행의 일련 과정을 앱 라이프 사이클(App Life Cycle)이라 부릅니다.

앱 라이프 사이클(App Life Cycle)은 AppDelegateSceneDelegate에 의해 관리되며 각각 하는 역할이 다릅니다.

📌 앱 라이프 사이클의 실행 시점 및 메서드

  • Not Running
    App이 실행되지 않은 상태를 의미합니다.

  • Foreground
    App의 실행 화면(Scene)을 사용자에게 보여주는 상태(영역)를 의미합니다.

    • Active: 사용자가 App을 100% 컨트롤 할 수 있는 상태
    • InActive: 사용자가 App을 100% 컨트롤 할 수 없는 상태(App 사용 중 전화 또는 문자와 같은 이벤트가 접근했을 때 App은 Active->InActive로 변환)
  • Background
    App의 실행 화면(Scene)이 내려간 상태(영역)를 의미합니다.

    • Background Running: App의 화면은 내려갔지만 계속 작동하는 상태를 의미합니다. 애플은 보안 등의 이유로 Background 영역에서 App의 작동을 허용하지 않습니다. 하지만 일부 App은 작동이 가능합니다.(음악 App 같은 경우는 작동을 허용)
  • Suspended
    실행 대기 상태(영역)를 의미합니다. App의 실행 화면(Scene)이 내려가면 대부분의 App은 대기상 태로 전환됩니다.

✔︎AppDelegate

1. didFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

Not Running 상태의 초기 App을 실행할 때 사용자에게 화면(Scene)이 보일 수 있도록 Foreground 영역에 접근하는 메서드이며, App 화면이 보이기 직전에 호출됩니다.
(해당 메서드는 Foreground 내부에 호출되는 메서드가 아님)

2. configurationForConnecting

 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

새로운 화면(Scene)을 생성할 때 호출되는 메서드입니다.

iOS 12 이전에는 하나의 디바이스에 단일 화면(Scene)만이 존재할 수 있었지만, iOS 13 부터는 하나의 디바이스(iPad)에 여러 화면을 가질 수 있게 되었습니다. (iPad의 멀태스킹/멀티화면 기능)

3. didDiscardSceneSessions

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }

화면의 세션(Scene Session)이 제거되기(버려지기) 직전에 호출되는 메서드입니다.

해당 메서드는 운영체제의 판단하에 호출되는 메서드이며, 화면을 영구적으로 메모리에서 해제할 때만 해당 메서드가 호출됩니다. (Background에 있는 App이 종료되려고 할 때 호출되는 메서드는 applicationWillTerminate: 메서드입니다.)


✔︎SceneDelegate

0. scene()

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
    }

화면(Scene)이 해당 App에 추가(연결)될 때 호출되는 메서드입니다.

1. sceneDidBecomeActive()

func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

화면(Scene)을 InActive에서 Active로 이동시킬 때 호출되는 메서드입니다.

App을 처음 실행할 때 사용자가 해당 App을 100% 조작할 수 있도록 Active로 안내?/이동? 시켜주는 메서드입니다. (해당 메서드는 Foreground 영역에서만 동작합니다.)

2. sceneWillResignActive()

func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

화면(Scene)을 Active에서 InActive로 이동시킬 때 호출되는 메서드입니다.

App 사용 중 전화 또는 문자 등의 특정 이벤트가 접근했을 때 해당 App의 화면은 sceneWillResignActive()메서드를 통해 Active에서 InActive로 이동합니다. (해당 메서드는 Foreground 영역에서만 동작합니다.)

3. sceneDidEnterBackground()

func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }

화면(Scene)을 InActive에서 Background 영역으로 이동시킬 때 호출되는 메서드입니다.

4. sceneWillEnterForeground()

func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

화면(Scene)을 Background 영역에서 Foreground(InActive)영역으로 이동시킬 때 호출되는 메서드입니다.

5. sceneDidDisconnect()

func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

화면(Scene)이 해제될 때 호출되는 메서드입니다.

해당 메서드는 App의 화면이 Background 영역에 들어간 직후 또는 해당 화면의 세션(Scene Session)이 버려질 때 호출되는 메서드입니다. (메모리로부터 영구적으로 버려지는 것이 아닙니다. 이는 사용자가 해당 화면에 다시 접근할 수 있는 여지가 있기 때문입니다. 즉, 완전한 App 종료가 이님!!)

작성한 내용 중 틀린 부분이 있다면 꼭 알려주세요!! (공부하면서 나름대로 이해한 부분만을 요약)


Reference

Apple Developer - UIApplicationDelegate
Apple Developer - Scene
스위프트 하이
앨런 iOS 아이폰 앱 개발

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글