[iOS] - 앱의 Life Cycle 관리하기, 생명 주기 알아보기



앱의 생명주기를 관리하는 법을 알아보자.


앱이 foreground에 있을 떄나 background에 있을 때 시스템 notification에 반응하고, 다른 시스템과 관련된 이벤트를 다룬다.

개요

앱의 현재 상태는 지금 뭘 할 수 있고 뭘 할 수 없는지를 판단한다. 예를 들어, foreground에 있는 앱은 사용자의 주의를 받고 있기 때문에 CPU를 포함해서 시스템 자원에 대한 우선순위가 높다. 반대로, background에 있는 앱은 화면에서 노출되지 않기 떄문에 가능한 한 가장 적은 일을 하거나 일을 아예 하지 않는다. 앱이 상태에서 상태로 전이하기 때문에, 이에 따른 행위를 정의해야 한다.

만약 앱의 상태가 바뀌면, UIKit은 적절한 delegate 객체의 메서드를 호출해서 나에게 알려준다.

  • iOS 13이나 이후에는 UISceneDelegate 객체를 이용해ㅐ서 scene을 기반으로 한 앱에서의 생명 주기 이벤트에 반응한다.
  • iOS 12나 그 이전에서는 UIApplicationDelegate 객체를 이용해서 생명주기 이벤트에 반응한다.

만약 앱에서 scene을 지원할 수 있다면, iOS는 항상 iOS 13이나 이후의 scene delegate를 사용할 것이고, 더 이른 버전에서는 app delegate를 사용할 것이다..

Scene을 기반으로 한 생명 주기 이벤트에 반응하기

만약 앱이 씬을 지원한다면, UIKit은 라이프 사이클 이벤트를 씬마다 분리한다. 씬은 기기에서 작동하고 있는 앱의 UI의 한 인스턴스를 나타낸다. 사용자는 각 앱의에서 여러개의 씬을 만들 수 있고, 각각을 별개로 보여주고 숨기는 것이 가능하다. 각 씬이 각각의 라이프 사이클을 갖고 있기 때문에, 각각은 실행 중에 다른 상태에 있을 수 있다. 예를 들어, foreground에 있는 씬이 있는데 다른 씬들은 background에 있거나 suspended될 수 있다.

씬은 지원하는 것은 opt-in 기능이다. 기본 지원을 활성화하기 위해서, 앱의 Info.plist에 UIApplicationSceneManifest 키를 추가하면 된다.

아래의 그림은 씬의 상태 전이를 보여준다. 사용자나 시스템이 앱을 위해 새로운 씬을 요청할 때, UIKit은 그걸 생성하고 unattached 상태로 만들어 놓는다. 사용자가 재 요청한 씬은 foreground로 빨리 이동하며, 화면에 노출되게 된다. 시스템이 재 요청한 씬은 일반적으로 background로 이동해서 이벤트를 처리할 수 있게 한다. 예를 들어, 시스템은 background에서 씬을 실행시켜서 location event를 처리하고 싶을 수 있다. 사용자가 앱의 UI를 해제했을 때, UIKit은 관련된 씬을 background 상태로 옮겨놓고 결국에는 suspended 상태로 만들어 놓는다. UIKit은 background나 suspended 씬을 자원을 재활용하기 위해 어느 때에든 연결을 끊을 수 있고, 그 씬을 unattached 상태로 되돌려놓는다.

image

씬 전이는 아래의 작업을 수행한다.

  • UIKit이 앱에 씬을 연결할 때, 씬의 초기 UI를 구성하고 씬이 필요한 데이터를 불러온다.
  • foreground-active 상태로 전이할 때, UI를 구성학 사용자와 상호작용할 준비를 한다. UI를 foreground에서 실행시킬 준비하는 것을 보면 된다.
  • 앱의 foreground-active 상태를 떠날 때, 데이터를 저장하고 앱의 동작을 잠재운다. UI를 background에서 실행시킬 준비하는 것을 보면 된다.
  • Background 상태로 진입했을 때, 중요한 작업을 마치고, 가능한 많은 메모리를 해제하고, 앱의 스냅샷을 위해 준비한다.
  • 씬의 연결을 끊을 때, 씬과 관련된 공유된 자원을 모두 해제한다.
  • 씬과 관련된 이벤트에 더해서, UIApplicationDelegate객체를 이용해서 앱의 실행에 응답해야 한다. 앱이 실행될 때 무엇을 해야하는지를 보려면 여기를 보면 된다.

App을 기반으로 한 생명 주기 이벤트에 반응하기

iOS 12와 그 이전 버전에서, 앱들은 scene을 지원하지 않기 때문에, UIKit은 모든 라이프 사이클 이벤트를 UIApplicationDelegate객체에 전달했다. 앱 delegate는 별개의 화면에서 출력되는 것을 포함해서 앱의 모든 윈도우를 관리한다. 결괒거으로, 앱의 상태 전이는 앱의 전체 UI에 영향을 줬다.

아래의 그림은 앱 delegte 객체를 포함해서 상태 전이를 보여준다. 실행 이후에, 시스템은 앱을 UI가 스크린에 띄워질지 아닌지를 판단해서 inactive나 background 상태로 옮겨놓는다. Foreground로 띄워질 때, 시스템은 앱을 자동으로 active 상태로 옮겨놓는다. 그 후에,, 상태는 앱이 종료될때까지 active와 background 사이를 왔다갔다 한다.

image

아래의 작업을 수행하기 위해 앱 전이를 사용한다.

  • 실행할 때, 앱의 데이터 구조와 UI를 초기화 한다.
  • Activate되었을 때, UI를 구성하는 것을 마치고 사용자와 상호작용할 준비를 한다.
  • Deactivate 되었을 때, 데이터를 저장하고 앱의 동작을 조용히한다.
  • background 상태로 진입했을 때, 중요한 동작을 마치고, 가능한 많은 메모리를 해제하고, 앱의 스냅샷을 위해 준비한다.
  • Terminate 되었을때, 모든 작업을 즉시 멈추고 공유된 모든 리소스를 해제한다. applicationWillTerminate(_:)가 여기 관여한다.

출처 및 참고

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