[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

iOS 13 이후

  • AppDelegate는 앱 전역에서 발생하는 이벤트(푸시 알림 등록 및 처리, URL 스킴 처리,데이터 초기화) Scene의 생성 / 종료만 관리
  • 각각의 Scene이 독립적으로 작동하기 위해 SceneDelegate에서 UI LifeCycle(활성화, 비활성화, 백그라운드 전환 등) 관리

iOS 13 이후 AppDelegate + Scene Delegate

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에서 여러 윈도우 동시 사용 가능)