[TIL] SceneDelegate

Eden·2025년 7월 1일

iOS 13부터 도입된 SceneDelegate는 멀티 윈도우 환경을 지원하기 위해 등장한 구조입니다.
기존의 AppDelegate가 처리하던 일부 역할을 분리하여, 각 씬(창)에 대한 생명 주기를 별도로 관리할 수 있도록 합니다.


1. SceneDelegate란?

  • iOS 13 이상에서 도입된 새로운 라이프사이클 관리 구조
  • 하나의 앱이 여러 개의 UIWindowScene을 가질 수 있게 되어, 각각의 씬을 관리하기 위해 사용됨
  • AppDelegate는 앱 전체의 라이프사이클,
    SceneDelegate는 각 개별 화면(윈도우)의 라이프사이클을 관리

2. 주요 메서드

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
  • 앱이 실행될 때 가장 먼저 호출되는 메서드 중 하나
  • 여기서 window를 생성하고 루트 뷰 컨트롤러를 설정
func sceneDidBecomeActive(_ scene: UIScene)
func sceneWillResignActive(_ scene: UIScene)
func sceneWillEnterForeground(_ scene: UIScene)
func sceneDidEnterBackground(_ scene: UIScene)
func sceneDidDisconnect(_ scene: UIScene)
  • 각각의 씬 상태 변화에 따라 호출
  • 백그라운드 진입, 포그라운드 복귀 등 상태 변화 처리 가능

3. SceneDelegate에서 window 설정

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: 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 = YourInitialViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}

4. AppDelegate vs SceneDelegate

항목AppDelegateSceneDelegate
iOS 버전모든 버전 (iOS 13 이상에서는 제한됨)iOS 13 이상
역할앱 전체의 라이프사이클 관리각 윈도우(씬)의 라이프사이클 관리
예시앱 실행, 푸시 알림 등록 등창 전환, 멀티 윈도우 등

5. 멀티 윈도우를 사용하는 경우

  • iPadOS에서 하나의 앱을 여러 개 창으로 열 수 있음
  • 이때 각 창마다 하나의 SceneDelegate 인스턴스가 생성됨
  • 사용자의 작업 맥락(Context)을 분리하여 유지할 수 있음

6. 주의사항

  • iOS 13부터 SceneDelegate 사용이 기본값이지만, Info.plist 설정을 통해 비활성화하고 AppDelegate만 사용할 수도 있음
  • AppDelegate의 기능 일부가 SceneDelegate로 분리되었기 때문에 앱 구성 시 역할 분리가 중요

결론

SceneDelegate는 각 씬 단위로 상태를 관리할 수 있게 만들어, 복잡한 앱 환경(특히 멀티 윈도우)을 더 잘 지원할 수 있도록 설계된 구조입니다. iOS 13 이상을 타겟으로 하는 앱에서는 반드시 구조를 이해하고 활용해야 안정적인 앱 상태 관리를 할 수 있습니다.

profile
iOS Dev

0개의 댓글