[iOS] App Life Cycle (앱의 생명 주기)
안녕하세요 띵지니어 입니다. 😼
앱의 생명 주기에 대해서 포스팅해보려고 합니다.
본글은 공식문서를 참고 하여 작성하였습니다.
앱의 생명주기는 iOS 13 이후와 이전으로 조금 달라졌습니다.
앱의 생명주기에서는
앱이 Foreground 또는 Background에 있을 때 시스템 알림에 응답하고, 다른 중요한 시스템 관련 이벤트를 다룹니다.
iOS 13 이상에서는 Scene 기반 앱의 LifeCycle 이벤트에 응답하기 위해 UISceneDelegate 개념을 도입 했고
iOS 12 이하에서는 UIApplicationDelegate를 사용하여 LifeCycle 이벤트에 응답합니다.
Scene
Scene은 앱 내에서 하나의 UI 화면 및 상태를 나타냅니다.
iPadOS에서 스플릿뷰와 같이 여러 앱을 동시에 사용할 수 있는 기능을 통해 Scene을 경험할 수 있습니다.
아래 예시를 보면 , 메모 앱과 메일 앱을 각각 독립된 Scene으로 사용해 멀티태스킹이 가능합니다.
각 Scene은 독립적인 생명주기를 가지며 실행 상태가 달라질 수 있습니다.
하나의 Scene이 Foreground에 있는 동안 다른 Scene은 background에 있을 수 있습니다.
사용자는 여러 Scene을 동시에 열어 멀티태스킹을 할 수 있으며, 각 Scene은 개별적으로 UISceneDelegate 객체를 통해 관리됩니다.
Tip: Scene 기능을 활성화하려면 UIApplicationSceneManifest 키를 Info.plist에 추가해야 합니다.
참고: Xcode 11 부터 새 프로젝트를 생성하면 기본적으로 Info.plist 파일에 UIApplicationSceneManifest 항목이 포함됩니다.
기본 값은 No(false) 라고 되어있습니다.
Yes(true)로 바꾸면 splitView 같은 멀티태스킹 모드가 가능 합니다.
1. 앱의 생명주기
iOS에서 앱의 생명주기(App Life Cycle)는 크게 다음과 같은 다섯 가지 주요 상태로 나눌 수 있습니다.
앱의 현재 상태 (App State)
• Not Running: 앱이 실행되지 않거나 메모리에서 완전히 제거된 상태입니다.
• InActive: 앱이 활성화되어 있지만 사용자 이벤트를 받지 않는 상태입니다.
예를 들어 멀티태스킹 윈도우, 전화, 알람등 앱이 일시적으로 Inactive 상태에 들어갑니다.
• Active: 앱이 활성화되고 사용자 이벤트를 받고 있는 상태로, 일반적으로 Foreground에서 앱이 표시되고 있을 때입니다.
• Background: 앱이 백그라운드로 전환된 상태로, 제한된 시간 동안 작업을 수행할 수 있으며, 이후 시스템 자원을 관리하기 위해 앱이 Suspended 상태로 이동할 수 있습니다. (보통 2-3초 뒤),
예를 들어 음악재생 같은 기능이 작동될 수 있습니다.
• Suspended: 앱이 백그라운드에 있지만 실행이 중지되어 메모리에만 유지되는 상태입니다. iOS의 메모리가 부족해지면 가장 먼저 메모리에서 해제되어 시스템은 Suspended 상태에서 앱을 종료할 수 있습니다. -> 앱을 종료하지 않았는데, 재시작되는 경우가 이런 경우
2. UIApplicationDelegate
AppDelegate.swift 에서 UIApplicationDelegate Protocol 을 채택합니다.
UIApplicationDelegate 주요 메서드는 아래와 같습니다.
• application(_:didFinishLaunchingWithOptions:)
앱이 시작되고 초기화 작업을 설정하는 메서드로, 앱의 초기화 작업, 데이터베이스 연결, 기본 설정 로드 등을 처리하기에 적합한 위치입니다.
• applicationDidBecomeActive(_:)
앱이 활성화되어 사용자 상호작용이 가능한 상태로 전환될 때 호출됩니다. 이 시점에서 타이머를 시작하거나 네트워크 연결을 초기화하는 등, 사용자가 화면을 보기 전에 수행해야 하는 작업을 설정할 수 있습니다.
• applicationWillResignActive(_:)
앱이 비활성화 상태로 전환되기 직전에 호출됩니다. 전화가 걸려오거나 홈으로 갈 때와 같은 상황에서 일시적으로 앱이 백그라운드로 전환될 때 필요한 작업(예: 진행 중인 게임 일시정지)을 설정합니다.
• applicationDidEnterBackground(_:)
앱이 백그라운드로 진입한 후 호출됩니다. 이 메서드 내에서는 상태 저장, 리소스 해제, 제한된 시간 내에 완료해야 하는 백그라운드 작업을 수행합니다.
• applicationWillTerminate(_:)
앱이 완전히 종료될 때 호출됩니다. 상태를 저장하고 데이터를 영구 저장소에 기록하는 작업을 수행합니다.
3. Scene 생명주기
iOS 13부터 도입된 Scene은 멀티윈도우 환경을 지원하며, 각 Scene기반 생명주기는 독립적인 생명주기를 가집니다. 이는 특히 iPad에서 여러 창을 동시에 사용하는 경우에 유용합니다.
Scene의 주요 상태는 다음과 같습니다:
• Unattached: Scene이 생성되었지만 아직 앱에 연결되지 않은 상태입니다. (App 생명주기의 Not Running과 다름 !!!)
멀티 태스킹이 활성화된 iPad 앱에서 두 번째 창을 열 준비는 되었지만, 아직 화면에 띄우지 않은 경우
iPadOS에서는 멀티 윈도우로 여러 Scene을 사용할 수 있습니다. 두 번째 Scene이 준비되었지만, 사용자가 Split View나 Slide Over 등으로 실제로 화면에 띄우지 않은 경우가 이에 해당됩니다. 이때 Scene은 Unattached 상태로 남아 있다가, 사용자가 해당 Scene을 화면에 띄우면 활성화됩니다.
• Foreground Active: Scene이 Foreground에서 활성 상태로, 사용자와 상호작용이 가능합니다.
앱 화면이 사용자에게 보이고 터치, 제스처, 입력 이벤트들이 정상적으로 처리되는 상태입니다.
• Foreground InActive: Scene이 Foreground에 있지만 이벤트를 처리하지 않는 상태입니다.
사용자가 앱을 사용 중이던 중 갑자기 전화나 알림이 나타나면서 앱이 잠시 이벤트 처리를 중단하게 되는 상황입니다.
• Background: Scene이 Background에서 실행 중인 상태입니다.
음악 앱에서 음악을 재생한 상태로 홈 화면으로 나가더라도, 음악이 계속 재생되는 상태가 Background에 해당됩니다.
• Suspended: Scene이 Background에서 실행을 중지하고 메모리에 유지되는 상태입니다.
사용자가 앱을 나가고 백그라운드 작업이 모두 완료된 후, 시스템에 의해 일시적으로 메모리에만 남아 있는 상태입니다
4. UISceneDelegate
SceneDelegate에서 UISceneDelegate Protocol을 채택합니다.
iOS 13 이후, 멀티 윈도우 지원을 위해 UISceneDelegate가 도입되었습니다. 이를 통해 각 Scene(창)의 생명주기를 독립적으로 관리할 수 있습니다.
UISceneDelegate 주요 메서드는 아래와 같습니다.
• scene(_:willConnectTo:options:)
Scene이 연결되고 초기화될 때 호출됩니다. 이 메서드는 Scene 기반의 UI 설정을 수행하고, 멀티 윈도우 환경을 지원하기 위한 초기 작업을 처리합니다.
(Unattached → Foreground Inactive)
• sceneDidDisconnect(_:)
Scene이 시스템에 의해 해제될 때 호출됩니다. 주로 앱 종료 시 사용됩니다.
• sceneDidBecomeActive(_:)
Scene이 활성화되어 사용자와 상호작용할 수 있는 상태가 될 때 호출됩니다. (Foreground Inactive → Foreground Active)
• sceneWillResignActive(_:)
Scene이 비활성화될 때 호출되며, 일시적으로 background로 전환될 때 필요한 작업을 처리합니다. (Foreground Active → Foreground Inactive)
• sceneWillEnterForeground(_:)
Scene이 background에서 Foreground로 전환될 때 호출됩니다. (Background → Inactive)
• sceneDidEnterBackground(_:)
Scene이 background로 전환될 때 호출됩니다. 앱의 데이터를 저장하거나 현재 상태를 보존하는 데 활용할 수 있습니다. (Inactive → Background)
5. Scene 호출 영상 (iOS 13.0 🆙)
1. 앱 켜질 때
scene(_:willConnectTo:options:) 호출 (Unattached → Foreground InActive)
sceneWillEnterForeground(_:) 호출 (Background → Foreground InActive)
sceneDidBecomeActive(_:) 호출 (Foreground Inactive → Foreground Active)
2. app Switching 할 때
sceneWillResignActive(_:) 호출 (Foreground Active -> Foreground InActive)
3. Background로 갈 때
sceneDidEnterBackground(_:) 호출 (Foreground InActive → Background)
4. 다시 Background에서 앱 킬 때
sceneWillEnterForeground(_:) 호출 (Background → Foreground InActive)
sceneDidBecomeActive(_:) 호출 (Foreground InActive → Foreground Active)
5. 앱 종료
sceneDidEnterBackground(_:) 호출 (Foreground InActive → Background)
sceneDidDisconnect(_:) 호출 (Background → 종료)
결론
iOS 13 이전에는 UIApplicationDelegate를 통해 앱 전체의 생명주기를 관리했지만, iOS 13 이후부터는 UISceneDelegate가 도입되면서 각 Scene별로 생명주기를 독립적으로 관리할 수 있게 되었습니다. 이러한 업데이트는 특히 iPad의 멀티윈도우 기능을 지원하기 위해 도입되었으며, 앱이 다양한 상태에서 효과적으로 자원을 관리하고 사용자 경험을 최적화할 수 있도록 도와준다고 합니다.
iOS 생명주기를 이해하고 활용함으로써 앱의 상태에 맞는 적절한 처리를 통해 안정적이고 원활한 사용자 경험을 제공할 수 있습니다.
앱 개발 시 UISceneDelegate와 UIApplicationDelegate의 상태 변화를 명확히 이해하고 관리하는 것이 중요합니다.
Xcode 16.0
iOS 18.1
MacOS Sequoir 15.0.1
환경에서 작성 한 글입니다.
감사합니다. 🤗
참고자료
https://clamp-coding.tistory.com/407
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle