https://developer.apple.com/documentation/uikit/managing-your-app-s-life-cycle
Managing your app’s life cycle | Apple Developer Documentation
Respond to system notifications when your app is in the foreground or background, and handle other significant system-related events.
developer.apple.com
참고
앱 생명주기 (Life Cycle)
iOS 앱의 실행부터 종료까지의 흐름을 관리하는 과정
앱의 상태 변화에 따라 시스템이 호출하는 이벤트와 개발자가 구현해야 하는 콜백 메서드로 이루어진다.
iOS 앱의 주요 상태(App State)
Foreground: 사용자의 이목을 끄는 앱. 시스템 자원에 대한 우선권을 가짐
Background: 가능한 적은 양의 작업을 수행하거나, 아무 것도 하지 않는 편이 좋음
NotRunning (앱 실행 전 상태)
- 앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태
Foreground - Inactive (비활성 상태)
- Inactive는 앱이 실행중이지만 사용자로부터 이벤트를 받을 수 없는 상태
- 앱이 화면에 보이지만 이벤트를 받지 않는 상태
- 멀티태스킹 윈도우로 진입하거나 앱 실행중 전화, 알림 등에 의해 앱을 사용할 수 없게 되는 경우 이 상태로 진입
- 예) 전화 수신 시, 잠금 화면으로 전환, 다른 앱으로 전환 직전
Foreground - Active (활성 상태)
- Active는 앱이 실제 실행중이고 사용자 이벤트를 받아서 상호작용할 수 있는 상태
- 모든 시스템 이벤트 수신
- 앱의 주요 작업 수행
- 배터리와 리소스를 가장 많이 사용
Background - Running (백그라운드 상태)
- Background는 홈 화면으로 나가거나 다른 앱으로 전환되어 현재 앱이 실질적인 동작을 하지 않는 상태
- 앱이 화면에 보이지 않지만 코드 실행 가능
- 제한된 시간 동안 작업 수행 가능
- 예시) 음악 재생, 위치 추적, 네트워크 다운로드, 푸시 알림 처리, 사용자가 앱을 사용하지 않는 동안 서버와 데이터를 동기화, 타이머
Background - Suspended (정지 상태)
- Suspended는 앱을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해서 메모리에 관련 데이터만 저장되어 있는 상태
- 메모리에 유지되어 빠른 재실행 가능
- 앱이 Background 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입 (보통 2-3초 이내)
- 시스템 리소스 최소 점유
- 메모리 부족 시 시스템이 해당 앱 종료 가능
- 따라서 앱을 종료시킨 적이 없더라도 앱을 다시 실행하려고 하면 처음부터 다시 실행된다.
UIKit의 앱 라이프사이클
UIKit 기반의 앱은 UIApplication과 AppDelegate를 중심으로 동작하며, 앱의 상태 변화를 콜백 메서드를 통해 감지하고 처리한다.
iOS 13 이후로는 앱의 주요 이벤트(푸시, 백그라운드)는 AppDelegate에서, 화면별 상태 관리는 SceneDelegate에서 수행한다.
- iOS 12 이전의 앱: UIApplicationDeleage 객체를 사용하여 life cycle 이벤트에 대응
- iOS 13 이후: UISceneDelegate 객체를 사용해 UI관련 life cycle 이벤트에 대응
Scene이란?
https://developer.apple.com/documentation/uikit/scenes
Scenes | Apple Developer Documentation
Manage multiple instances of your app’s UI simultaneously, and direct resources to the appropriate instance of your UI.
developer.apple.com
Multiple Window를 위해 Scene이라는 개념이 추가되었음
씬(Scene)은 iOS 13부터 도입된 개념으로, "앱의 UI를 독립적으로 관리하는 단위"
기존에는 앱이 하나의 윈도우(Window)만 가졌지만, iPadOS 및 macOS에서 멀티 윈도우 지원을 위해 씬 개념이 추가되었음
- 앱의 UI와 그에 따른 사용자 상호작용의 컨텍스트(Context)
- 앱에서 여러 개의 Scene을 동시에 열고 관리할 수 있음
- 멀티 윈도우를 지원하며 각 Scene은 독립적인 생명주기를 가짐
- 유저 활동 관리
- NSUserActivity를 통해 Scene별로 딥링크, 상태 복원 가능
- 각각의 씬이 독립적인 UI를 가짐
- iPad에서 하나의 앱을 두 개의 창으로 띄울 수 있음 (예: Safari에서 두 개의 웹페이지 열기)
- macOS에서 Catalyst 앱이 여러 개의 창을 가질 수 있음
- 앱 라이프사이클과 별도로 씬의 라이프사이클이 존재
- 앱 전체가 아니라 각 씬(Scene)마다 라이프사이클이 따로 관리됨
- UIApplicationDelegate → 앱 전체의 상태 관리
- UISceneDelegate → 개별 씬(Scene)의 상태 관리
씬(Scene)과 앱(App)의 차이
앱(App) | 씬(Scene) | |
개념 | 하나의 실행 프로세스 | 앱 내에서 독립적으로 UI를 담당하는 단위 |
라이프사이클 | AppDelegate에서 관리 | SceneDelegate에서 관리 |
멀티 윈도우 | iOS 12까지는 지원 X | iOS 13부터 지원 (iPad에서 여러 창 띄울 수 있음) |
Q: iOS의 씬(Scene)이란?
씬(Scene)은 iOS 13부터 도입된 개념으로, 앱의 UI를 독립적으로 관리하는 단위
iOS 13부터 SceneDelegate가 추가되면서 앱(App)의 라이프사이클과 씬(Scene)의 라이프사이클이 분리되었음
기존에는 앱이 하나의 윈도우(Window)만 가졌지만, 씬을 도입하면서 iPad나 macOS에서 멀티 윈도우를 지원할 수 있게 되었다.
앱 전체의 상태는 UIApplicationDelegate에서 관리하고, 씬의 상태는 UISceneDelegate에서 관리한다.
각 씬은 SceneDelegate를 통해 라이프사이클을 관리하며, 포그라운드, 백그라운드 전환 등을 개별적으로 처리할 수 있다.
iOS 앱 생명주기 흐름 변화 (iOS 12 이전 vs iOS 13 이후)
iOS 13부터는 멀티 윈도우 지원을 위해 Scene Delegate가 도입되면서 앱의 생명주기 관리 방식이 변경되었다.
이에 따라 AppDelegate와 SceneDelegate가 각각의 역할을 분리하여 관리한다.
- iOS 12 이전: 하나의 화면(Window)만 존재
- iOS 13 이후: 여러 Scene(Window)을 동시에 실행 가능
iOS 13 이전(AppDelegate 기반)
iOS 13 이전에는 AppDelegate가 앱의 모든 생명주기를 관리했다.
AppDelegate에서 UI LifeCycle과 Process LifeCycle을 가지고 있어서, UI들이 Process 공간을 공유하기 구조적으로 어려웠다.
앱은 오직 하나의 Process와 하나의 UI만 가졌다.
AppDelegate의 주요 역할 (iOS 12 이하)
- 앱 생명주기 관리: 앱의 실행, 비활성화, 종료 이벤트 관리
- 푸시 알림 처리: 원격 알림 등록 및 수신 처리
- 백그라운드 작업: 앱이 백그라운드로 전환될 때 데이터 저장 및 작업 처리
- 딥링크 처리: URL Scheme, 유니버설 링크 처리
iOS 12 이전 생명주기 흐름
application(_:didFinishLaunchingWithOptions:) | 앱이 처음 실행될 때 (초기화 작업 수행) |
applicationDidBecomeActive(_:) | 앱이 활성화될 때 (포그라운드 진입) |
applicationWillResignActive(_:) | 앱이 비활성화되기 직전 (잠깐 포커스 잃음) |
applicationDidEnterBackground(_:) | 앱이 백그라운드로 이동할 때 (데이터 저장) |
applicationWillEnterForeground(_:) | 앱이 다시 포그라운드로 복귀할 때 |
applicationWillTerminate(_:) | 앱이 종료되기 직전 (리소스 정리) |
iOS 13 이후 (SceneDelegate 도입)
iOS 13부터는 SceneDelegate가 추가되어 앱의 여러 화면(Scene)을 독립적으로 관리할 수 있게 되었다.
이를 통해 멀티 윈도우 지원 및 각 Scene의 생명주기를 개별적으로 관리한다.
AppDelegate는 Process LifeCycle관리만 하고, SceneDelegate는 UI LifeCycle을 담당한다.
UI LifeCycle과 Process LifeCycle을 분리하게 되면 여러 Scene들은 Process memory 공간을 공유할 수 있어서 multiple windows가 가능하게 되는 것이다.
Scene들과 AppDelagate와의 연결은 SceneSession이 한다.
iOS 13.0 이후의 AppDelegate 역할
- 앱의 중요한 데이터 구조를 초기화한다.
- Scene을 환경설정한다.
- 앱 밖에서 발생하는 알림에 대응한다. (배터리 부족, 전화 수신)
- 특정 Scene, View, ViewController에 한정되지 않고, 앱 자체를 타깃으로 하는 이벤트에 대응한다.
- 애플 푸시 알림 서비스처럼 실행 시 요구되는 모든 서비스를 등록한다.
AppDelegate의 역할 (iOS 13 이상)
- 앱의 전체 생명주기 관리
- 앱 시작, 종료와 같은 전역 이벤트 처리
- 푸시 알림 등록 및 수신
- 앱 진입점 관리 (UIApplication 객체 설정)
SceneDelegate의 역할 (iOS 13 이상)
- Scene(화면)의 생명주기 관리
- 각 Scene의 생성, 활성화, 비활성화, 종료 처리
- 딥링크 처리 (Scene 단위로)
- 멀티 윈도우 지원
- iPadOS에서 여러 Scene 생성 및 관리
iOS 13 이후 생명주기 흐름
application(_:didFinishLaunchingWithOptions:) | 앱 초기화 (가장 먼저 호출됨) |
application(_:configurationForConnecting:options:) | 새로운 Scene이 생성될 때 SceneDelegate와 연결 |
applicationDidEnterBackground(_:) | 모든 Scene이 백그라운드로 진입했을 때 호출 |
applicationWillTerminate(_:) | 앱 종료 전 호출 (Scene 종료와 무관) |
scene(_:willConnectTo:options:) | 새로운 Scene이 생성될 때 호출 (초기화 작업 수행) |
sceneDidBecomeActive(_:) | Scene이 포그라운드로 진입했을 때 호출 |
sceneWillResignActive(_:) | Scene이 비활성화되기 직전 (다른 Scene으로 전환 시) |
sceneDidEnterBackground(_:) | Scene이 백그라운드로 진입했을 때 호출 |
sceneDidDisconnect(_:) | Scene이 해제될 때 호출 (리소스 정리) |
iOS 12 이전 vs iOS 13 이후 차이점
iOS 12 이전 (AppDelegate) | iOS 13 이후 (AppDelegate + SceneDelegate) | |
앱 생명주기 관리 | AppDelegate에서 전체 앱 상태 관리 | AppDelegate와 SceneDelegate로 역할 분리 |
Scene 관리 | 하나의 화면만 관리 | 여러 Scene(윈도우)을 독립적으로 관리 |
멀티 윈도우 지원 | 지원하지 않음 | 지원 (iPadOS에서 멀티 윈도우 사용 가능) |
딥링크 처리 | AppDelegate에서 처리 | 각 Scene에서 독립적으로 처리 가능 |
백그라운드 처리 | applicationDidEnterBackground() 사용 | 각 Scene에서 sceneDidEnterBackground() 사용 |
종료 처리 | applicationWillTerminate() 호출 | 개별 Scene은 sceneDidDisconnect()로 종료 |
iOS 13 이상 생명주기 흐름도
AppDelegate는 전체 앱 흐름 관리
- didFinishLaunchingWithOptions: 앱 초기화
- applicationDidEnterBackground: 모든 Scene이 백그라운드로 진입 시 호출
- applicationWillTerminate: 앱이 종료되기 직전 호출
SceneDelegate는 각 화면(Scene) 흐름 관리
- scene(_:willConnectTo:options:): Scene 생성 시 호출
- sceneDidBecomeActive: Scene이 포그라운드로 활성화
- sceneDidEnterBackground: Scene이 백그라운드로 진입
왜 SceneDelegate가 중요한가?
- 멀티 윈도우 지원: iPad에서 동시에 여러 Scene 실행 가능
- 독립적 화면 관리: Scene마다 별도 생명주기 관리로 유연성 증가
- 코드 분리: AppDelegate와 SceneDelegate로 로직이 명확히 분리됨
'iOS' 카테고리의 다른 글
[iOS] How to Play Video: AVFoundation, HLS, DRM, FPS, Chromecast (0) | 2025.03.23 |
---|---|
[iOS] WebKit - WKNavigationDelegate (1) | 2025.02.23 |
[iOS] WebKit - WKScriptMessageHandler, WKScriptMessageHandlerWithReply (0) | 2025.02.22 |
[Swift] Ping 로직 (0) | 2024.05.10 |
메모리 최적화 - iOS Memory Deep Dive (1) | 2024.02.23 |