App의 생명 주기는 App의 실행/종료 및 App이 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정을 뜻합니다.
App State는 총 다섯가지 상태로 구분할 수 있습니다.
Not Running은 앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태.
Inactive는 app이 실행중이지만 사용자로부터 event를 받을 수 없는 상태. multitasking window로 진입하거나 app 실행중 전화, 알림 등에 의해 app을 사용할 수 없게 되는 경우 이 상태로 진입.
Active는 app이 실제 실행중이고 사용자 event를 받아서 상호작용할 수 있는 상태.
(바로 Active가 되지 않고 Inactive 상태를 거쳐 Active상태가 된다.)
Background는 홈화면으로 나가거나 다른 app으로 전환되어 현재 app이 실질적인 동작을 하지 않는 상태. 예를 들어 Music app을 닫아도 재생한 음악이 계속 실행되는 경우. 사용자가 app을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업을 이 상태에서 할 수 있습니다.
Suspended는 app을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해 메모리에 관련 데이터만 저장되어있는 상태. app이 background 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입하게 됩니다.(보통 2~3초 이내) Suspended 상태의 app들은 iOS의 메모리가 부족해지면 가장 먼저 메모리에서 해제됨. 따라서 app을 종료시킨 적이 없더라도 app을 다시 실행하려고 하면 처음부터 다시 실행됩니다.
App의 상태를 전환시키는 시스템 Notification에 반응하여 현재 상태변화에 대응되는 method를 통해 작업을 할 수 있습니다.
UIApplicationDelegate
객체에서 관리했었습니다. 따라서 해당 protocol을 채택하는 AppDelegate에서 대응되는 method를 구현합니다.UISceneDelegate
에서 관리하고, 해당 protocol을 채택하고 있는 SceneDelegate가 각각의 Scene에서 관리하는 UI Life Cycle에 대응되는 method들을 구현하게 되었습니다.AppDelegate
에서, 앱이 Foreground와 Background 상태에 있을 때 상태 전환과 관련된 UI Life Cycle은 SceneDelegate
에서 관리합니다. SceneDelegate를 사용하지 않도록 설정하면 예전처럼 AppDelegate가 모든 Life Cycle에 대한 관리 책임을 갖지만, 그렇지 않으면 UI Life Cycle은 SceneDelegate를 통해 관리해야 합니다.iOS 12이전 또는 Scene을 사용하지 않는다면 모든 Process/UI Life Cycle eventsms AppDelegate로 전달됩니다.
앱이 실행되면 Not Running에서 Inactive를 거쳐 Active로 상태가 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.
application(_:didFinishLaunchingWithOptions:)
applicationDidBecomeActive(_:)
앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background로 상태가 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.
applicationWillResignActive(_:)
applicationDidEnterBackground(_:)
Background 상태에 있는 앱을 다시 실행하면 Inactive를 거쳐 Active 상태로 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.
applicationWillEnterForeground(_:)
applicationDidBecomeActive(_:)
사용자가 직접 앱을 종료시키는 경우, 앱은 다시 Not Running 상태로 돌아갑니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.
applicationWillTerminate(_:)
앱이 사용자에 의해 종료될 때 호출됩니다. 시스템에 의해 예기치 못한 상황에서 종료될 때는 호출되지 않습니다.
iOS 13 이후의 앱에서 Scene을 사용한다면 각각의 분리된 Scene의 UI Life Cycle event들은 SceneDelegate로 전달됩니다.
앱이 실행되면 앱을 화면에 보여주기 위한 모든 설정이 끝나고 다음 method가 호출됩니다.
application(_:didFinishLaunchingWithOptions:)
앱이 실행되면 UIKit에 Scene을 연결해야 합니다. Scene이 연결되고 화면에 나타나기까지 과정에서 다음 순서로 method들이 호출됩니다.
application(_:configurationForConnecting:options:)
scene(_:willConnectTo:options:)
sceneDidBecomeActive(_:)
앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background로 상태가 전환됩니다. 이 때, SceneDelegate는 Scene에 다음 순서로 method를 호출하도록 요청합니다.
sceneWillResignActive(_:)
sceneDidEnterBackground(_:)
Background 상태에 있는 앱을 다시 실행하면 Inactive를 거쳐 Active 상태로 전환됩니다. 이 때, SceneDelegate는 시스템에 다음 순서로 method를 호출하도록 요청합니다.
sceneWillEnterForeground(_:)
sceneDidBecomeActive(_:)
기존 App-Based Life Cycle에서는 멀티태스킹 창에서 swipe up 제스처를 사용하여 앱을 종료시켰습니다. 하지만 Scene을 사용할 때는 multi window를 지원하기 때문에, 앱이 둘 이상의 scene window를 갖는다면 swipe up 제스처는 앱을 종료시키지 않고 Scene을 해제시키게 됩니다. 만약 모든 Scene의 연결이 해제되었다면 앱이 종료됩니다.
Scene 연결이 해제될 때는 다음 순서로 method가 호출됩니다.
sceneDidDisconnected(_:)
application(_:didDiscardSceneSessions:)
applicationWillTerminate(_:)
UI Life Cycle의 책임이 Scene으로 옮겨가면서, AppDelegate의 method 이름이 application에서 scene으로 바뀌기만 했을 뿐 맡은 역할과 호출되는 시점은 동일합니다.
참고 및 그림 출처
https://velog.io/@delmasong/Managing-Your-Apps-Life-Cycle
https://hcn1519.github.io/articles/2017-09/ios_app_lifeCycle
https://cskime.tistory.com/11?category=801416
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
우앙 귿