[iOS] AppDelegate와 SceneDelegate 차이

황석범·2024년 12월 3일
0

내일배움캠프_iOS_5기

목록 보기
41/76

참고: 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 중심의 생명주기 관리

scene(_:willConnectTo:options:)

  • 새로운 Scene이 생성될 때 호출.

sceneDidBecomeActive(_:)

  • Scene이 Active 상태가 되었을 때 호출.

sceneWillResignActive(_:)

  • Scene이 Inactive 상태로 전환되기 직전에 호출.

sceneDidEnterBackground(_:)

  • Scene이 Background 상태로 전환될 때 호출.

sceneWillEnterForeground(_:)

  • Scene이 Background에서 Active로 전환되기 전에 호출.

생명주기와 메모리 관리

  • iOS 시스템은 메모리를 효율적으로 관리하기 위해 백그라운드 상태의 앱을 필요에 따라 종료할 수 있습니다. 앱의 중요한 데이터는 백그라운드 전환 시 저장하고, 종료 시 복구를 위한 작업을 구현해야 합니다.

생명 주기 관리 팁

  1. 중요한 데이터는 applicationDidEnterBackground 또는 sceneDidEnterBackground에서 저장.
  2. 리소스 집약적인 작업은 앱이 Active 상태일 때 수행.
  3. 백그라운드 상태에서 작업이 필요하면 Background Tasks API를 활용.
  4. 앱 상태 전환 시 사용자 경험을 고려한 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는 앱 전체의 생명주기를 관리합니다. 앱의 실행 상태와 전역 이벤트를 처리하며, 기본적으로 앱과 관련된 모든 주요 작업의 시작점으로 사용됩니다.

주요 특징

  • 앱 수준 이벤트를 처리

    • 앱이 시작되었을 때 (application(_:didFinishLaunchingWithOptions:))
    • 앱이 백그라운드로 전환되었을 때 (applicationDidEnterBackground(_:))
    • 앱이 종료되기 직전에 (applicationWillTerminate(_:))
  • 푸시 알림, 심화 백그라운드 작업 등 앱 전역 기능을 담당

  • iOS 12 및 이전 버전에서는 화면 관련 이벤트와 앱 생명주기를 모두 처리


SceneDelegate

역할

  • SceneDelegate는 앱의 UI 생명주기를 관리하며, iOS 13부터 도입된 Scene 기반 멀티윈도우를 지원합니다. 각 Scene은 독립적인 UI 환경을 나타내며, SceneDelegate는 이러한 Scene별로 생명주기를 처리합니다.

주요 특징

  • 화면(Scene) 수준 이벤트를 처리:
    • Scene이 포그라운드로 들어올 때 (sceneDidBecomeActive)
    • Scene이 백그라운드로 전환될 때 (sceneDidEnterBackground)
    • Scene이 연결될 때 (scene(_:willConnectTo:options:))
  • 멀티 윈도우 지원: iPad에서 여러 Scene(창)을 동시에 열 수 있음
  • 앱이 멀티윈도우를 지원하지 않더라도 기본적으로 SceneDelegate가 설정됨

요약

구분AppDelegateSceneDelegate
도입 시점iOS 2.0 (최초부터)iOS 13 (Scene 기반 멀티윈도우 도입)
역할앱 전역 상태 관리개별 Scene(UI 환경) 상태 관리
멀티윈도우 지원지원하지 않음지원
주요 이벤트앱 시작, 종료, 알림, 백그라운드 작업 등Scene 활성화, 비활성화, 포그라운드 전환
사용 위치모든 앱에서 사용iOS 13 이상에서 SceneDelegate 필요

iOS 13 이상 앱의 기본 설정

  • iOS 13 이상에서는 SceneDelegate가 도입되며, 앱 템플릿에 기본적으로 아래와 같은 구조가 생성됩니다.

    • AppDelegate.swift: 앱 전역 이벤트 처리.
    • SceneDelegate.swift: 각 Scene(UI)의 상태 관리.

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를 독립적으로 관리할 필요가 있는 경우 적합.
profile
iOS 공부중...

0개의 댓글

관련 채용 정보