티스토리 뷰
iOS 개발을 하다 보면 앱이 실행되고 종료될 때 어떤 과정을 거치는지 정확히 이해하는 게 중요하다.
앱이 백그라운드로 갔다가 다시 활성화되거나, 완전히 종료될 때 어떤 일이 벌어지는지 알면 더 안정적인 앱을 만들 수 있다!
이번 글에서는 iOS 앱의 생명주기(App Lifecycle)를 단계별로 정리하고, 각 상태에서 해야 할 작업을 살펴보겠다.
1️⃣ iOS 앱 생명주기 개요
iOS 앱은 실행되는 동안 다섯 가지 상태를 거친다.
| 상태 | 설명 |
| Not Running | 앱이 실행되지 않음 (완전히 종료된 상태) |
| Inactive | 앱이 실행되었지만, 사용자 입력을 받지 않는 상태 |
| Active | 앱이 실행 중이며, 사용자 입력을 받을 수 있는 상태 |
| Background | 앱이 화면에서 사라졌지만, 백그라운드 작업을 수행할 수 있는 상태 |
| Suspended | 앱이 백그라운드에 있지만 실행되지 않고, 메모리에 유지된 상태 |
이 상태들이 어떻게 전환되는지 흐름을 정리하면 아래와 같다.
[Not Running] → [Inactive] → [Active] → [Background] → [Suspended] → [Not Running]
2️⃣ 앱 상태별 특징과 해야 할 일
✅ Not Running
- 앱이 실행되지 않은 상태.
- 사용자가 앱을 실행하면 Inactive 상태로 이동한다.
📌 해야 할 일
- 따로 처리할 작업 없음.
✅ Inactive
- 앱이 활성화되었지만, 사용자 입력을 받지 않는 상태.
- 앱이 Foreground로 올라올 때 잠깐 이 상태를 거친다.
- 전화가 오거나, 알림 창이 뜰 때도 이 상태가 될 수 있다.
📌 해야 할 일
- UI 업데이트 준비.
- 네트워크 요청을 미리 시작할 수도 있음.
func applicationWillResignActive(_ application: UIApplication) {
print("앱이 Inactive 상태로 변경됨!")
}
✅ Active
- 앱이 실행 중이며, 사용자 입력을 받을 수 있는 상태.
- 대부분의 UI 업데이트와 로직이 이 상태에서 실행된다.
📌 해야 할 일
- UI 업데이트 및 애니메이션 실행.
- 실시간 데이터 동기화.
- 앱이 다시 활성화되었을 때 필요한 데이터 요청.
func applicationDidBecomeActive(_ application: UIApplication) {
print("앱이 Active 상태로 변경됨!")
}
✅ Background
- 앱이 화면에서 사라졌지만, 백그라운드에서 작업을 수행할 수 있는 상태.
- 백그라운드 작업이 끝나면 Suspended 상태로 이동한다.
📌 해야 할 일
- 중요한 데이터를 저장 (UserDefaults, CoreData).
- 백그라운드 실행이 필요한 경우 beginBackgroundTask 사용.
func applicationDidEnterBackground(_ application: UIApplication) {
print("앱이 Background 상태로 변경됨!")
}
📌 백그라운드 실행 예제
백그라운드에서 다운로드 같은 작업을 계속하려면 beginBackgroundTask를 활용하면 된다.
var backgroundTask: UIBackgroundTaskIdentifier = .invalid
func applicationDidEnterBackground(_ application: UIApplication) {
backgroundTask = application.beginBackgroundTask {
application.endBackgroundTask(self.backgroundTask)
self.backgroundTask = .invalid
}
DispatchQueue.global().async {
self.doSomeBackgroundWork()
}
}
func doSomeBackgroundWork() {
for i in 1...5 {
print("백그라운드 작업 진행 중: \(i)")
sleep(1)
}
}
✅ Suspended
- 앱이 백그라운드에 있지만, 실행되지 않는 상태.
- CPU를 사용하지 않고 메모리에만 유지된다.
- iOS가 메모리가 부족하면 앱을 강제 종료할 수도 있음.
📌 해야 할 일
- 이 상태에서는 코드 실행이 불가능하기 때문에, 백그라운드 상태에서 필요한 데이터 저장을 미리 완료해야 한다.
3️⃣ iOS 13 이후 SceneDelegate의 변화
iOS 13부터는 멀티 윈도우 지원을 위해 SceneDelegate가 도입됐다.
이전에는 AppDelegate에서 모든 생명주기를 관리했지만, 이제는 개별 씬(Scene) 단위로 관리할 수 있다.
✅ AppDelegate → 앱의 전체적인 생명주기 관리
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
print("앱 실행됨!")
return true
}
✅ SceneDelegate → 개별 씬의 생명주기 관리
func sceneDidBecomeActive(_ scene: UIScene) {
print("Scene이 Active 상태가 됨!")
}
func sceneDidEnterBackground(_ scene: UIScene) {
print("Scene이 Background 상태가 됨!")
}
즉, 여러 개의 윈도우 씬이 있을 경우 SceneDelegate를 사용해야 한다는 점을 기억하자!
정리
✅ 앱은 Not Running → Inactive → Active → Background → Suspended 상태를 거친다.
✅ AppDelegate와 SceneDelegate를 활용하여 생명주기 이벤트를 처리할 수 있다.
✅ 백그라운드 상태에서는 데이터를 저장하거나 작업을 이어서 수행할 수 있다.
✅ iOS 13 이후에는 SceneDelegate를 활용하여 멀티 윈도우를 관리해야 한다.
앱 생명주기를 이해하고, 상황에 맞게 적절한 처리가 필요하다!
'iOS' 카테고리의 다른 글
| iOS 스태틱 vs 다이나믹 라이브러리, 뭐가 다를까? (0) | 2025.03.05 |
|---|---|
| iOS Xcode 빌드 단계(Build Process) 완벽 정리 (0) | 2025.03.04 |
| OperationQueue - iOS에서 비동기 작업을 효율적으로 관리하는 방법! (0) | 2025.02.27 |
| Async/Await 완벽 정리 – 왜 써야 할까? 어떻게 써야 할까? (0) | 2025.02.26 |
| iOS에서 비동기 작업을 처리하려면? GCD(DispatchQueue)를 이해하자! (0) | 2025.02.25 |