[UIKit]
[Swift/UIKit] AppDelegate, SceneDelegate
Jayden_iOS
2024. 5. 22. 00:11
iOS 생명주기는 iOS 13 전후로 나뉜다. iPadOS의 등장으로 멀티 윈도우를 지원하면서 화면의 개념이 scene으로 변경 되었다.
하나의 앱에서 여러 개의 윈도우를 동시에 사용할 수 있게 되면서 UI 생명주기를 전담해줄 SceneDelegate가 생겼다.
iOS 13 이전
- 앱에 하나의 윈도우만 존재
- AppDelegate가 App LifeCycle, UI LifeCycle 모두 담당
iOS 13 이후
- AppDelegate는 앱 전역에서 발생하는 이벤트(푸시 알림 등록 및 처리, URL 스킴 처리,데이터 초기화) Scene의 생성 / 종료만 관리
- 각각의 Scene이 독립적으로 작동하기 위해 SceneDelegate에서 UI LifeCycle(활성화, 비활성화, 백그라운드 전환 등) 관리
AppDelegate
- 데이터 구조 초기화
- Scene 환경설정
- 앱 외부에서 발생한 알림 대응
- 앱 전역 이벤트 대응
- 푸쉬 알림 등 실행시 요구되는 서비스 등록 및
// 애플리케이션이 실행된 직후, 사용자의 화면에 보여지기 직전에 호출
// 데이터 구조 초기화 및 서비스 설정, 초기 데이터 로드 등을 수행.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
print("애플리케이션 실행 완료. 초기화 작업 수행.")
return true
}
// 애플리케이션이 최초 실행될 때, 초기화 작업 전에 호출
// 상태 복원 이전에 데이터 구조 초기화 및 기본 설정을 수행.
func application(
_ application: UIApplication,
willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
print("애플리케이션 최초 실행. 상태 복원 이전의 작업 수행.")
return true
}
// 애플리케이션이 Inactive 상태로 전환되기 직전에 호출
// 앱 전역 이벤트 대응. 예: 전화 수신 또는 멀티태스킹 UI가 나타날 때.
func applicationWillResignActive(_ application: UIApplication) {
print("애플리케이션이 Inactive 상태로 전환됩니다.")
}
// 애플리케이션이 백그라운드 상태로 전환된 직후 호출
// 앱 전역 이벤트 대응. 예: 데이터 저장 또는 리소스 정리.
func applicationDidEnterBackground(_ application: UIApplication) {
print("애플리케이션이 백그라운드 상태로 전환되었습니다.")
}
// 애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출
// Scene 환경설정 및 백그라운드에서 포그라운드로 복귀 작업 수행.
func applicationWillEnterForeground(_ application: UIApplication) {
print("애플리케이션이 포그라운드로 복귀합니다.")
}
// 애플리케이션이 Active 상태로 전환된 직후 호출
// Scene 환경설정 완료 후 사용자와 상호작용 준비 상태.
func applicationDidBecomeActive(_ application: UIApplication) {
print("애플리케이션이 Active 상태로 전환되었습니다.")
}
// 애플리케이션이 종료되기 직전에 호출
// 중요 데이터를 저장하거나 리소스를 정리하는 작업 수행.
func applicationWillTerminate(_ application: UIApplication) {
print("애플리케이션이 종료됩니다.")
}
SceneDelegate
- Scene(UI) 초기화 및 설정
- Scene별 UI 상태 관리 (활성화, 비활성화)
- 포그라운드 및 백그라운드 상태 전환 관리
- 멀티 윈도우 지원 및 상태 분리
- 앱 UI 복구 및 유지
// Scene이 생성되고 시스템과 연결될 준비가 되었을 때 호출
// UIWindow를 생성하고 루트 뷰 컨트롤러를 설정
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = ViewController() // 루트 뷰 컨트롤러 설정
self.window = window
window.makeKeyAndVisible()
print("Scene이 연결되었습니다.")
}
// Scene이 활성화되었을 때 호출
// 사용자와 상호작용할 준비가 완료된 상태
func sceneDidBecomeActive(_ scene: UIScene) {
print("Scene 활성화")
}
// Scene이 비활성화되기 직전에 호출
func sceneWillResignActive(_ scene: UIScene) {
print("Scene 비활성화")
}
// Scene이 포그라운드로 복귀하기 직전에 호출
// UI를 다시 활성화할 준비
func sceneWillEnterForeground(_ scene: UIScene) {
print("Scene 포그라운드 복귀")
}
// Scene이 백그라운드로 전환되었을 때 호출
func sceneDidEnterBackground(_ scene: UIScene) {
print("Scene 백그라운드 전환")
}
마무리
구분 | iOS 13 이전 | iOS 13 이후 |
관리 단위 | 앱 전체 | 각 Scene |
AppDelegate | App LifeCycle 및 UI LifeCycle 모두 담당 | App LifeCycle(전역 이벤트, Scene 생성/종료)만 담당 |
SceneDelegate | 없음 | UI LifeCycle(활성화, 비활성화, 백그라운드 등) 관리 |
멀티 윈도우 지원 | 지원하지 않음 | 지원 (iPadOS에서 여러 윈도우 동시 사용 가능) |