참고: https://velog.io/@lhj26/iOS-Scene-Delegate-vs-App-Delegate
참고: https://velog.io/@maddie/iOS-AppDelegate-vs-SceneDelegate-%EC%B0%A8%EC%9D%B4

AppDelegate와 SceneDelegate의 차이에 대해 알아보자
AppDelegate와 SceneDelegate는 iOS 앱의 생명주기를 관리하는 역할을 담당하지만, iOS 13 이후 도입된 멀티 윈도우 지원(Scene 기반 아키텍처)으로 인해 이 둘의 역할이 분리되었습니다.



앱 생명주기라는 말이 나온다. 앱 생명주기에 대해 먼저 알아보자.
앱 생명주기
- iOS 앱의 생명주기(App Lifecycle)는 앱이 사용자와 상호작용하는 동안 특정 상태로 전환되는 과정을 설명합니다. 이러한 생명주기는 앱의 상태를 관리하고 적절한 동작을 구현할 수 있도록 설계되었습니다.
앱의 주요 상태
1.Not Running
- 앱이 실행되지 않았거나 시스템에 의해 종료된 상태.
2. Inactive
- 앱이 활성 상태이지만 사용자와의 상호작용이 없는 상태.
- 예: 전화 수신, 알림 표시 등의 이유로 임시로 비활성화됨.
- 짧은 기간 동안만 유지됨.
3. Active
- 앱이 포그라운드에 있으며 사용자와 상호작용할 수 있는 상태.
- 주로 사용자의 입력을 처리하거나 화면을 업데이트.
4. Background
- 앱이 화면에서 사라졌지만 백그라운드에서 작업을 수행 중인 상태.
- 예: 데이터 저장, 다운로드 작업 등.
- 작업이 완료되면 Suspended 상태로 전환.
5. Suspended
- 앱이 백그라운드에서 실행 중이지만 활동을 멈춘 상태(메모리만 유지).
- 메모리 부족 시 시스템에 의해 강제로 종료될 수 있음.
생명주기 메서드
- iOS 앱의 생명주기 이벤트는 UIApplicationDelegate와 UISceneDelegate 프로토콜을 통해 관리됩니다.

1. UIApplicationDelegate 주요 메서드
application(_:didFinishLaunchingWithOptions:)
- 앱이 시작된 후 초기화할 때 호출.
- 앱 설정, 의존성 주입, 초기 데이터를 로드.
applicationWillResignActive(_:)
- 앱이 Inactive 상태로 전환되기 직전에 호출.
- 타이머 일시 정지, 중요한 데이터 저장 등.
applicationDidEnterBackground(_:)
- 앱이 Background 상태로 전환될 때 호출.
- 작업 완료, 데이터 저장, 백그라운드 작업 시작.
applicationWillEnterForeground(_:)
- 앱이 Background에서 Active로 전환되기 전에 호출.
- UI 업데이트, 앱 데이터 새로 고침 준비.
applicationDidBecomeActive(_:)
- 앱이 Active 상태가 되었을 때 호출.
- 사용자 인터페이스를 활성화하고 작업 재개.
applicationWillTerminate(_:)
- 앱이 종료되기 직전에 호출.
- 데이터 저장 및 정리.
2. UISceneDelegate 주요 메서드 (iOS 13+)
scene(_:willConnectTo:options:)
sceneDidBecomeActive(_:)
- Scene이 Active 상태가 되었을 때 호출.
sceneWillResignActive(_:)
- Scene이 Inactive 상태로 전환되기 직전에 호출.
sceneDidEnterBackground(_:)
- Scene이 Background 상태로 전환될 때 호출.
sceneWillEnterForeground(_:)
- Scene이 Background에서 Active로 전환되기 전에 호출.
생명주기와 메모리 관리
- iOS 시스템은 메모리를 효율적으로 관리하기 위해 백그라운드 상태의 앱을 필요에 따라 종료할 수 있습니다. 앱의 중요한 데이터는 백그라운드 전환 시 저장하고, 종료 시 복구를 위한 작업을 구현해야 합니다.
생명 주기 관리 팁
- 중요한 데이터는 applicationDidEnterBackground 또는 sceneDidEnterBackground에서 저장.
- 리소스 집약적인 작업은 앱이 Active 상태일 때 수행.
- 백그라운드 상태에서 작업이 필요하면 Background Tasks API를 활용.
- 앱 상태 전환 시 사용자 경험을 고려한 UI 업데이트를 준비.
생명 주기 관리 팁 예시
1. 음악 스트리밍 앱
- sceneDidEnterBackground
사용자가 앱을 백그라운드로 전환하면 스트리밍을 멈추거나 백그라운드 재생 여부를 결정합니다.
예) 무료 사용자라면 음악 재생을 중지하고, 유료 사용자라면 재생을 유지
func sceneDidEnterBackground(_ scene: UIScene) {
if !UserDefaults.standard.bool(forKey: "isPremiumUser") {
MusicPlayer.shared.pause()
print("Free user: Pausing music in background")
} else {
print("Premium user: Continuing music in background")
}
}
- sceneWillEnterForeground
앱이 다시 활성화되었을 때, 재생 상태를 확인하고 사용자에게 알림을 표시합니다.
예) 무료 사용자에게 "백그라운드 재생을 원하시나요? 프리미엄을 구독하세요!" 팝업 표시
func sceneWillEnterForeground(_ scene: UIScene) {
if !UserDefaults.standard.bool(forKey: "isPremiumUser") {
showPremiumAdPopup()
}
}
2. 은행 앱
- sceneDidEnterBackground
앱이 백그라운드로 전환되면 민감한 정보를 보호하기 위해 화면을 흐리게 처리합니다.
func sceneDidEnterBackground(_ scene: UIScene) {
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = window?.frame ?? .zero
window?.addSubview(blurEffectView)
print("Added blur effect to secure sensitive data")
}
- sceneWillEnterForeground
앱이 다시 활성화되면 사용자의 재인증이 필요합니다.
예) Face ID 또는 PIN 입력 화면 표시.
func sceneWillEnterForeground(_ scene: UIScene) {
let isAuthenticated = BiometricAuth.shared.authenticate()
if !isAuthenticated {
showLoginScreen()
print("User authentication required")
}
}
AppDelegate와 SceneDelegate 차이
AppDelegate와 SceneDelegate는 iOS 앱의 생명주기를 관리하는 역할을 담당하지만, iOS 13 이후 도입된 멀티 윈도우 지원(Scene 기반 아키텍처)으로 인해 이 둘의 역할이 분리되었습니다.
AppDelegate
역할
- AppDelegate는 앱 전체의 생명주기를 관리합니다. 앱의 실행 상태와 전역 이벤트를 처리하며, 기본적으로 앱과 관련된 모든 주요 작업의 시작점으로 사용됩니다.
주요 특징
SceneDelegate
역할
- SceneDelegate는 앱의 UI 생명주기를 관리하며, iOS 13부터 도입된 Scene 기반 멀티윈도우를 지원합니다. 각 Scene은 독립적인 UI 환경을 나타내며, SceneDelegate는 이러한 Scene별로 생명주기를 처리합니다.
주요 특징
- 화면(Scene) 수준 이벤트를 처리:
- Scene이 포그라운드로 들어올 때 (sceneDidBecomeActive)
- Scene이 백그라운드로 전환될 때 (sceneDidEnterBackground)
- Scene이 연결될 때 (scene(_:willConnectTo:options:))
- 멀티 윈도우 지원: iPad에서 여러 Scene(창)을 동시에 열 수 있음
- 앱이 멀티윈도우를 지원하지 않더라도 기본적으로 SceneDelegate가 설정됨
요약
구분 | AppDelegate | SceneDelegate |
---|
도입 시점 | iOS 2.0 (최초부터) | iOS 13 (Scene 기반 멀티윈도우 도입) |
역할 | 앱 전역 상태 관리 | 개별 Scene(UI 환경) 상태 관리 |
멀티윈도우 지원 | 지원하지 않음 | 지원 |
주요 이벤트 | 앱 시작, 종료, 알림, 백그라운드 작업 등 | Scene 활성화, 비활성화, 포그라운드 전환 |
사용 위치 | 모든 앱에서 사용 | iOS 13 이상에서 SceneDelegate 필요 |
iOS 13 이상 앱의 기본 설정
iOS 13 이전과의 호환성
- iOS 13 이전 버전에서는 SceneDelegate가 없으며, 모든 생명주기 이벤트가 AppDelegate에서 처리됩니다.
- iOS 13 이상에서도 SceneDelegate를 사용하지 않으려면 Info.plist 파일에서 Application Scene Manifest 항목을 제거하면 됩니다.
언제 어떤 것을 사용해야 할까?
AppDelegate:
- 앱 전역 설정, 초기화, 푸시 알림 등록, 심화 백그라운드 작업 등 앱 중심 이벤트를 처리할 때 사용.
- Scene과 무관한 작업(예: Core Data 초기화, Third-party SDK 설정 등)에 적합.
SceneDelegate:
- UI와 관련된 작업, 즉 Scene 중심 이벤트를 처리할 때 사용.
- 여러 창(Scene)에서 UI를 독립적으로 관리할 필요가 있는 경우 적합.