[iOS] App Life Cycle / 앱의 생명 주기

2022. 11. 9. 11:02🍏/OS

1. App Life Cycle

앱 생명 주기

Not Running

앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태.

가능한 작업: 없음

Inactive

앱이 전면에서 실행 중이지만, 아무런 이벤트를 받지 않고 있는 상태. 예) 전화 수신, 알림 표시 등 일시 진입

가능한 작업: UI 업데이트를 중단하고 중요한 데이터를 보존할 준비를 할 수 있음

Active

앱이 전면에서 실행 중이며, 이벤트를 받고 있는 상태.

가능한 작업: 일반적인 앱 작업 수행, 사용자 입력 처리

Background

앱이 백그라운드에 있지만 여전히 코드가 실행되고 있는 상태. 대부분 앱은 Suspended 상태로 이행하는 도중에 일시적으로 이 상태에 진입하지만, 파일 다운로드나 업로드, 연산 처리 등 여분의 실행 시간이 필요한 앱일 경우 특정 시간 동안 이 상태로 남아 있게 되는 경우도 존재. 예) 음악 재생, 데이터 다운로드, 위치 추적

가능한 작업: 제한된 시간 동안 작업 수행 가능(약 30초)

Suspended

앱이 메모리에 유지되지만 실행되는 코드가 없는 상태. 메모리가 부족한 상황이 오면 iOS 시스템은 Foreground에 있는 앱의 여유 메모리 공간을 확보하기 위해 Suspended 상태에 있는 앱들을 특별한 알림 없이 정리.

가능한 작업: 없음(시스템이 필요하면 메모리에서 제거)


2. 상태 변화에 따라 호출되는 AppDelegate 또는 SceneDelegate 메서드

AppDelegate 메서드:

  • 앱 시작 및 종료 관련:
    • application(_:didFinishLaunchingWithOptions:)
      • 앱이 시작할 때 한 번 호출됩니다. 초기화 작업 수행.
    • applicationWillTerminate(_:)
      • 앱이 종료되기 직전에 호출됩니다. 저장되지 않은 데이터를 저장하는 작업 수행.
  • 상태 변화 관련:
    • applicationDidBecomeActive(_:)
      • 앱이 활성화 상태가 되었을 때 호출됩니다.
    • applicationWillResignActive(_:)
      • 앱이 비활성화 상태로 전환되기 직전에 호출됩니다.
    • applicationDidEnterBackground(_:)
      • 앱이 백그라운드 상태로 전환되었을 때 호출됩니다.
    • applicationWillEnterForeground(_:)
      • 앱이 백그라운드에서 포어그라운드로 전환되기 직전에 호출됩니다.

SceneDelegate 메서드 (iOS 13+):

  • Scene 관련:
    • scene(_:willConnectTo:options:)
      • 앱의 새로운 씬이 생성될 때 호출됩니다.
    • sceneDidDisconnect(_:)
      • 씬이 해제될 때 호출됩니다.
  • 상태 변화 관련:
    • sceneDidBecomeActive(_:)
      • 씬이 활성화될 때 호출됩니다.
    • sceneWillResignActive(_:)
      • 씬이 비활성화될 때 호출됩니다.
    • sceneDidEnterBackground(_:)
      • 씬이 백그라운드로 전환될 때 호출됩니다.
    • sceneWillEnterForeground(_:)
      • 씬이 포어그라운드로 전환될 때 호출됩니다.

3. 백그라운드에서 작업을 완료하기 위한 방법

  1. 백그라운드 작업 실행 (Background Task)
    • 앱이 백그라운드로 전환되었을 때 제한된 시간(약 30초) 동안 작업을 수행할 수 있습니다.
    • beginBackgroundTask(expirationHandler:)를 사용하여 작업 수행.
     
  2. 백그라운드 모드 사용 (Background Modes):
    • 특정 작업(음악 재생, 위치 추적, VoIP 등)은 Background Modes 설정을 통해 계속 실행 가능합니다.
    • Info.plist에서 UIBackgroundModes 키를 추가하여 사용.
  3. Push Notification 처리:
    • 원격 푸시 알림을 통해 백그라운드 작업을 트리거할 수 있습니다.
    • 예: 콘텐츠 업데이트.
  4. URLSession:
    • Background Transfer Service를 사용하여 대용량 데이터를 백그라운드에서 다운로드하거나 업로드할 수 있습니다.
    • URLSession(configuration:delegate:delegateQueue:)를 통해 백그라운드 세션을 구성.
  5. Core Location:
    • 위치 기반 서비스 앱은 Background Modes를 활성화하여 지속적인 위치 추적 가능.
var backgroundTask: UIBackgroundTaskIdentifier = .invalid

func applicationDidEnterBackground(_ application: UIApplication) {
    backgroundTask = application.beginBackgroundTask {
        // 만료 시 호출
        application.endBackgroundTask(self.backgroundTask)
        self.backgroundTask = .invalid
    }
    // 백그라운드 작업 수행
}