본문 바로가기

All Categories/iOS & Swift

iOS) 앱의 생명주기 관리

반응형

안녕하세요 재희입니다!

대표 면접질문, 앱의 생명주기에 관한 애플 공식 문서를 살펴 보겠습니다.


Managing Your App's Life Cycle

 

Apple Developer Documentation

 

developer.apple.com

앱이 foreground 또는 background에 있을 때 시스템 알림에 응답하고, 기타 중요한 시스템 관련 이벤트를 처리합니다.

 

개요

앱의 현재 상태에 따라 수행할 수 있는 작업과 수행할 수 없는 작업이 결정됩니다.

예를 들어, foreground 일 때 유저에게 집중하기 때문에, CPU를 포함한 시스템 리소스보다 우선됩니다.

반대로, background 일 때는 offscreen이기 때문에, 가능한 한 작업을 적게 해야하며, 가급적 아무 작업도 하지 않아야 합니다.

앱의 상태가 변경되면, 그에 따라 동작을 조정해야 합니다.

  • iOS 13 이상에서는 UISceneDelegate object를 사용하여 scene-based 앱의 life-cycle 이벤트에 응답합니다.
  • iOS 12 이하에서는 UIApplicationDelegate object를 사용하며 life-cycle 이벤트에 응답합니다.

Scene-Based Life-Cycle

앱이 scene을 지원하는 경우, UIKit은 각각 별도의 life-cycle 이벤트를 제공해야 합니다.

scenedevice에서 실행 중인 앱의 UI 인스턴스 하나를 의미합니다.

사용자는 각 앱에 해당하는 여러 개의 scene을 만들어, 개별적으로 보여주거나 숨길 수 있습니다.

각 scene마다 life cycle이 있기 때문에, 각각은 다른 실행 상태에 있을 수 있습니다.

예를 들어, 한 scene은 foreground에 있고, 다른 scene은 background에 있거나 suspended(일시 중단)되어 있을 수 있습니다.

 

scene 지원은 opt-in(당사자가 개인 데이터 수집을 동의한 경우에만 데이터를 수집할 수 있는 방식) 기능입니다.
기본 지원을 활성화하려면, 앱이 지원하는 scene 지정의 설명에 따라, Info.plist 파일에 UIApplicationSceneManifest 키를 추가합니다.

 

다음은 scene의 상태 전환을 보여줍니다.

사용자나 시스템이 앱에 대한 새로운 scene을 요청하면, UIKit에서 해당 scene을 만들어 unattached 상태로 전환합니다.

사용자가 요청한 scene은 화면 맨 앞(foreground)으로 빠르게 이동하여 화면에 나타납니다.

시스템 요청 scene은 일반적으로 background로 이동하여 이벤트를 처리할 수 있습니다.

예를 들어, 시스템이 background에서 scene을 시작하여 location event를 처리할 수 있습니다.

사용자가 앱의 UI를 해제하면, UIKit은 연결된 장면을 background 상태로 이동한 후, suspended(일시 중단) 상태로 전환합니다.

UIKit은 언제든지 background 또는 suspended scene의 연결을 끊고 리소스를 회수하여, 해당 scene을 unattached 상태로 되돌릴 수 있습니다.

 

scene transition을 사용하여 다음 작업을 수행:

  • UIKit이 scene을 앱에 연결하면, scene의 초기 UI를 구성하고 scene에서 필요한 데이터를 로드합니다.
  • Foreground-active 상태로 전환하면, UI를 구성하고 사용자와 상호 작용할 준비를 합니다. (Foreground에서 UI 실행 준비 참고)
  • Foreground-active 상태를 종료하면, 데이터를 저장하고 앱의 동작을 정지합니다. (UI를 background에서 실행할 준비 참고)
  • Background 상태로 전환되면, crucial task를 완료하고, 가능한 많은 메모리를 확보한 후, 앱 snapshot을 준비합니다. (UI를 background에서 실행할 준비 참고)
  • scene 연결 해제 시, scene과 관련된 공유 리소스를 정리합니다.
  • scene 관련 이벤트 외에도, UIApplicationDelegate object를 사용하여 앱 launch에도 응답해야 합니다. (앱 실행 시 수행한 작업에 대한 자세한 내용은 앱 실행 시 응답을 참조)

App-Based Life-Cycle

iOS 12 이하 버전 및 scene을 지원하지 않는 앱에서, UIKit은 모든 life-cycle event를 UIApplicationDelegate 객체에 전달합니다.

app delegate는, 별도의 화면에 표시되는 창을 포함하여, 앱의 모든 창을 관리합니다.

결과적으로, 앱 상태 전환은 외부 디스플레이의 콘텐츠를 포함하여 앱의 전체 UI에 영향을 미칩니다.

 

다음 그림은 app delegate object와 관련된 상태 전환을 보여줍니다.

실행 후, 시스템은 UI가 화면에 표시되려고 하는지 여부에 따라, 프로그램을 inactive 또는 background 상태로 전환합니다.

Foreground로 실행 시, 시스템은 자동으로 앱을 active 상태로 전환합니다.

이후 앱이 종료될 때까지 상태는 activebackground 사이에서 변동합니다.

 

app transition을 사용하여 다음 작업을 수행:


 

요약

iOS 13 이후 scene-based

  • Unattached: scene이 시스템으로부터 connection notification을 받기 전까지의 상태. 메모리를 점유하고 있고, 실행 중인 상태
  • Foreground Inactive: scene이 연결되어 Foreground로 가기 전(시스템 자동 수행), foreground 또는 Background로 전환되는 상태(사용자나 시스템 이벤트로 발생)
  • Foreground Active
  • Background
  • Suspended: scene이 백그라운드에 있고 아무것도 실행되지 않는 프로세스 대기 상태. 메모리는 점유하지만 대기중인 상태

 

iOS 12 이하 app-based

  • Not Running:  아예 App이 실행되지 않았거나, 시스템에 의해서 종료된 상태. 메모리에도 없고, 프로세스의 관점에서도 아무 것도 실행되지 않음.
  • Inactive: app이 실행될 때(시스템 자동 수행), 또는 foreground 또는 Background로 전환되는 상태(사용자나 시스템 이벤트로 발생)
  • Active
  • Background
  • Suspended: scene이 백그라운드에 있고 아무것도 실행되지 않는 프로세스 대기 상태. 메모리는 점유하지만 대기중인 상태

 

부족한 내용이 있으면 댓글 부탁드립니다. 보충할 내용이 생기면 수정하겠습니다!

감사합니다 :D

반응형