소피it블로그

[UIKit] App's Life Cycle 앱의 라이프 사이클 정리 본문

개발_iOS/UIKit

[UIKit] App's Life Cycle 앱의 라이프 사이클 정리

sophie_l 2022. 8. 10. 23:34

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 

Apple Developer Documentation

 

developer.apple.com

1. Overview

 

앱의 현재 상태는 앱이 할 수 있는 것과 없는 것을 결정한다. 예를 들어 포그라운드에 나와있는 앱은 유저의 관심 대상이기 때문에 CPU를 포함한 시스템 자원에 대해 우선권을 갖는다. 반면 백그라운드의 앱은 스크린에 나와있지 않기 때문에 가장 이상적으로는 아무 것도 안 하는 게 좋고, 최소한의 일을 수행해야 한다. 앱의 상태가 바뀌기 때문에 각각의 상태에 걸맞게 조절해야 한다.

앱의 상태가 변경되면 UIKit은 적절한 delegate 객체를 호출함으써 개발자에게 알려준다.

 

  • iOS 13 이후에는 UISceneDelegate 객체를 통해 scene에 기반한 라이프 사이클에 응답한다.
  • iOS 12 이전에는 라이프 사이클 이벤트에 응답하기 위해 UIApplicationDelegate를 사용한다.

2. Scene에 기반한 라이프 사이클 이벤트에 응답하기

 

앱이 scene을 지원한다면 UIKit는 각각의 씬에 대해 별개의 라이프사이클 이벤트를 전달한다. 씬은 기기에서 실행되는 앱의 UI의 한 인스턴스를 나타낸다. 유저는 각 앱에 대하여 여러 개의 씬을 만들 수 있고, 각각을 별개로 보여주거나 숨길 수 있다. 각 씬마다 별개의 라이프 사이클이 있기 때문에 각각은 서로 다른 실행 단계에 있을 수 있다. 예를 들어 하나의 씬은 포그라운드에 있는 반면 다른 씬들은 백그라운드에 있거나 중지되어 있을 수 있다.

다음 그림은 씬들의 상태 변환을 보여준다. 유저나 시스템이 새로운 씬을 요청한다면 UIKit는 이를 만들어서 unattached 상태로 둔다. 유저가 요청한 씬은 포그라운드로 더 빨리 움직이며 스크린 위에 나타난다. 시스템이 요청한 씬은 보통 백그라운드로 움직여 이벤트를 처리한다. 예를 들어 시스템은 씬을 백그라운드에 론치하여 위치 이벤트를 처리하고자 할 수 있다. 유저가 앱의 UI를 해제한다면, UIKit는 연관된 씬을 백그라운드 상태로 옮기며 최종적으로는 중지되게 한다. UIKit는 백그라운드나 중지된 씬을 언제고 연결 해제하여 자원을 회수할 수 있으며, 해당 씬은 unattached 상태로 돌아가게 된다.

다음과 같은 작업들을 수행하기 위해 씬 전환을 사용하라:

 

  • UIKit가 씬을 앱에 연결시킬 때 씬의 초기 UI를 구성하고 씬이 필요로 하는 데이터를 불러오기
  • 포그라운드 액티브 상태로 전환할 때, UI를 구성하고 유저와의 상호작용을 준비하기
  • 포그라운드 액티브 상태를 떠나기 직전에 데이터를 저장하고 앱의 행동을 중지시키기
  • 백그라운드 상태에 진입할 때 중요한 작업을 끝내고 가능한 한 많은 메모리를 해제하며 앱 스냅샷을 준비하기
  • 씬이 연결 해제될 때 씬과 연관된 공유 자원을 정리하기
  • 씬과 관련된 이벤트와 더불어 앱의 런치에 응답하기 위해 UIApplicationDelegate 객체를 사용하여야 한다.

3. 앱에 기반한 라이프 사이클 이벤트에 응답하기

 

iOS 12와 그 이전 버전, 그리고 씬을 지원하지 않는 앱들에서는 UIKit는 모든 라이프 사이클 이벤트를 UIApplicationDelegate 객체에 전달한다. 앱 delegate는 별개의 화면에 보여지는 것을 포함한 앱의 모든 윈도우를 관리한다. 그 결과로 앱의 상태 전환은 외부 디스플레이에 보여지는 내용을 포함한 앱의 UI 전체에 영향을 끼친다.

이하의 그림은 앱 delegate 객체와 관련한 상태 전환을 보여준다. 런치 이후에 시스템은 UI가 화면에 곧바로 나타날 것인지 여부에 따라 앱을 비활동적인 또는 백그라운드 상태에 둔다. 포그라운드에 런치할 때는 시스템은 앱을 자동적으로 액티브한 상태로 변환한다. 그 후에는 앱이 종료될 때까지 액티브와 백그라운드 상태를 왔다갔다 한다.

다음과 같은 작업을 위해 앱 전환을 사용하라:

 

  • 런치할 때 앱의 구조와 UI를 초기화하기
  • 활성화할 때 UI 구성을 끝마치고 유저와의 상호작용 준비하기
  • 비활성화 직전에 데이터를 저장하고 앱을 잠잠하게 만들기
  • 백그라운드에 진입할 때 중요한 작업을 끝내고 메모리를 최대한 해제하며 앱 스냅샷을 준비하기
  • 종료시에 모든 일을 완전히 그만두고 공유 자원을 해제하기