오늘의 지식: iOS 앱 라이프사이클

3 분 소요

앱은 실행 상태뿐만 아니라 여러 가지 상태를 가지고 있습니다. 앱을 실행한 후 사용하다가 전화가 오거나 알림이 올 때, 다른 앱을 켰을 때, 화면을 내렸을 때와 같은 이벤트가 발생했을 때 앱의 상태도 변경됩니다. 이러한 상태를 추적하고 관리해야 앱을 더욱 안정적으로 동작하게 만들 수 있습니다.

앱 라이프사이클 관리란 앱이 포그라운드나 백그라운드에 있을 때 시스템이 알리는 알림에 응답하고 다른 중요한 시스템 관련 이벤트를 처리하는 것을 말합니다.

개요

앱의 현재 상태에 따라 언제든지 할 수 있는 작업과 할 수 없는 작업이 결정됩니다. 예를 들어 포그라운드 앱은 사용자와 상호작용을 해야 하므로 CPU를 포함하여 시스템 리소스보다 높은 우선순위를 가집니다. 반대로 백그라운드 앱은 화면 밖에 있기 때문에 최대한 적은 작업을 수행해야 하며, 가급적 아무것도 수행하지 않아야 합니다. 앱의 상태가 변경되면 그에 따라 동작을 조정해줘야 합니다.

앱의 상태가 변경되면 UIKit은 적절한 델리게이트 객체의 메서드를 호출하여 알려줍니다.

  • iOS 13 이상 scene 기반의 앱에서는 UISceneDelegate 객체를 사용하여 라이프사이클에 대한 이벤트를 알려줍니다.
  • iOS 12 이하의 앱에서는 UIApplicationDelegate 객체를 사용하여 라이프사이클에 대한 이벤트를 알려줍니다.

🗒 앱에서 scene을 활성화하면 iOS 13 이상에서는 항상 scene delegate를 사용합니다. iOS 12 미만에서는 app delegate를 사용합니다.

Scene 기반의 라이프사이클 이벤트

앱이 scene을 지원하는 경우 UIKit은 각각에 대해 별도의 라이프사이클 이벤트를 제공합니다. scene은 기기에서 실행되는 앱 UI 하나의 인스턴스를 나타냅니다. 사용자는 각 앱에 대해 여러 scene을 만들고 개별적으로 표시하거나 숨길 수 있습니다. 각 scene은 고유한 라이프사이클을 가지고 있으므로 개별 scene은 다른 실행 상태에 있을 수 있습니다. 예를 들어 한 scene은 포그라운드 상태에 있고 다른 scene은 백그라운드 상태에 있거나 일시 중지된 상태에 있을 수 있습니다.

❗️scene은 opt-in 기능입니다. opt-in이란 허용 옵션을 의미합니다. 허용해야 사용 가능한 것을 말합니다. 기본 지원을 활성화하려면 앱 Info.plist 파일에 UIApplicationSceneManifest 키를 Specifying the Scenes Your App Supports에서 설명하는 것처럼 추가해야 합니다.

다음 그림은 scene의 상태 전환을 나타냅니다. 사용자나 시스템이 앱에 새로운 scene을 요청하면 UIKit에서는 scene을 만들고 unattached 상태로 둡니다. 사용자가 요청한 scene은 화면에 나타나는 foreground로 빠르게 이동합니다. 시스템이 요청한 scene은 일반적으로 백그라운드로 이동하여 이벤트를 처리할 수 있습니다. 예를 들어 시스템은 scene을 백그라운드에서 실행하여 위치 이벤트를 처리할 수 있습니다. 사용자가 앱 UI를 닫으면 UIKit은 연결된 scene을 background로 이동시키고 결국에는 suspended 상태로 전환합니다. UIKit은 언제든지 background 상태인 scene이나 suspended 된 scene의 연결을 끊고 리소스를 회수하여, 해당 scene을 unattached 상태로 되돌릴 수 있습니다.

2021-05-02 at 22.42.05 PM-apple scene lifecycle

scene 상태 변화에 따른 다음 작업을 수행하세요.

  • UIKit이 scene을 앱에 연결할 때, scene의 UI를 초기화하고 scene에 필요한 데이터를 불러옵니다.
  • foreground-active 상태로 전환할 때, UI를 구성하고 사용자와 상호 작용할 준비를 합니다.
  • foreground-inactive 상태로 전환할 때, 데이터를 저장하고 앱을 조용히 하도록 합니다.
  • background 상태로 전환할 때, 중요한 작업은 완료하고 최대한 많은 메모리를 확보합니다. 그리고 앱의 스냅샷을 준비합니다.
  • scene과 연결이 끊어지면 scene과 관련된 모든 공유하고 있는 리소스를 정리합니다.
  • scene 관련 이벤트뿐만 아니라 앱 시작 시 UIApplicationDelegate 객체를 사용하여 응답해야 합니다.

앱 기반의 라이프사이클 이벤트

iOS 12 이하이거나 scene을 지원하지 않는 앱에서는 UIKit이 UIApplicationDelegate 객체에 모든 이벤트를 전달합니다. 앱 델리게이트는 앱의 모든 윈도우와 별도로 화면에 표시되는 창을 포함하여 관리합니다. 결과적으로 앱의 상태 전환은 외부 디스플레이 콘텐츠를 포함하여 앱 UI 전체에 영향을 미칩니다.

다음 그림은 앱 델리게이트 객체와 관련된 상태 전환을 나타냅니다. 앱 시작 후 시스템은 앱을 UI가 화면에 표시될 것인지에 따라 inactive 상태 또는 background 상태로 전환합니다. 포그라운드로 실행할 때 시스템은 앱을 자동으로 active 상태로 전환합니다. 그 이후에는 앱이 종료될 때까지 포그라운드와 백그라운드 상태 사이에서 변동합니다.

2021-05-04 at 22.42.05 PM-apple apple lifecycle

앱 상태 변화에 따른 다음 작업을 수행하세요.

  • 앱 시작 시, 데이터 구조와 UI를 초기화합니다.
  • active 상태로 전환할 때, UI 구성을 완료하고 사용자와 상호 작용할 준비를 합니다.
  • inactive 상태로 전환할 때, 데이터를 저장하고 앱을 조용히 하도록 합니다.
  • background 상태로 전환할 때, 중요한 작업은 완료하고 최대한 많은 메모리를 확보합니다. 그리고 앱의 스냅샷을 준비합니다.
  • 앱 종료 시, 모든 작업을 즉시 중단하고 공유 리소스를 해제합니다.

다른 중요한 이벤트

라이프사이클 이벤트를 처리하는 것 외에도 다음과 같은 이벤트를 처리할 준비를 해야 합니다. 이러한 이벤트 대부분은 UIApplicationDelegate 객체를 사용하여 처리합니다. 때에 따라 알림 기능을 사용하여 이러한 알림을 처리할 수 있으므로 앱의 다른 부분에서 응답할 수 있습니다.

메모리 경고

메모리 사용량이 너무 높을 때 발생하는 이벤트입니다. 앱에서 사용하는 메모리를 줄여야 합니다.

보호 데이터 사용 가능/불가능

사용자가 기기를 잠그거나 잠금을 해제할 때 발생하는 이벤트입니다.

핸드오프 작업

NSUserActivity 객체를 처리해야 할 때 발생하는 이벤트입니다.

시간 변경

통신사가 시간 업데이트를 보내는 경우와 같이 시간 변경에 대한 이벤트입니다.

URL 열기

앱에서 리소스를 열어야 할 때 발생하는 이벤트입니다.

참고 링크


Apple Managing Your App’s Life Cycle

카테고리:

업데이트:

댓글남기기