공식문서 : Managing Your App's Life Cycle
Life cycle이란, App의 "상태" 개념을 말합니다. 예로, 어떤 App이 당장 화면에 보이고 있는 상태인지, 화면에 보이진 않지만 뭔가 동작 중이라던지 등이 해당됩니다. 이 상태에 따라 언제든지 가능한 작업과 그렇지 않은 작업이 다르므로, 우리는 App이 어떤 작업을 수행할 때 상태를 고려하도록 만들어야 합니다
UIKit은 App의 상태가 변경됨을 delegate 객체의 메서드를 호출함으로써 우리에게 알려줍니다. 우리는 이 메서드에 각 상태 별로 필요한 작업을 기술할 수 있습니다
iOS 13을 기점으로 Multiple Window를 지원하기 위해 Scene이라는 개념이 생겼습니다. Scene을 지원하는 App의 경우 Life cycle 노티를 수신하는 delegate가 AppDelegate가 아닌 SceneDelegate가 됩니다
정리하면, iOS 12까지는 항상 AppDelegate
가 수신하고, iOS 13부터는 Info.plist에서
Scene configuration을 제공하는지 여부에 따라 AppDelegate
혹은 SceneDelegate
가 수신합니다. 참고로, Scene configuration은 Xcode 프로젝트 생성 시 자동으로 추가되어 있어 기본적으론 SceneDelegate가 수신합니다
만약 Multiple Window를 지원하고 싶다면, Scene configuration에서 디폴트 false로 되어 있는 Scene Support를 true로 변경해주어야 합니다
🔘 Scene Life Cycle
Unattached
ForegroundInactive
ForegroundActive
Background
Suspend
🔘 일반적인 흐름
unattached
상태에 놓습니다foreground
로 빠르게 이동합니다background
로 이동합니다 (ex. 시스템은 위치 이벤트를 처리하기 위해 background에 scene을 만들 수 있습니다)background
상태로 보내고 결국 suspended
상태가 됩니다unattached
상태로 보냅니다)UIKit이 scene을 App에 연결할 때
scene의 초기 UI를 설정하고 scene에 필요한 data를 불러온다
forground-active 상태로 갈 때
UI를 설정하고 유저 interaction을 준비한다
Preparing Your UI to Run in the Foreground
forground-active를 떠나자마자
data를 저장하고 App의 행동을 종료시킨다
Preparing Your UI to Run in the Background
background에 진입하자마자
중요한 task는 종료시키고 메모리는 가능한 한 해제시키며 App의 snapshot을 준비한다
Preparing Your UI to Run in the Background
disconnection 될 때 (=goto unattached)
해당 scene과 관련된 모든 공유 자원을 정리한다
App launch
scene 관련 이벤트에 더해 App의 launch 상황에도 응답해야 한다 (UIApplicationDelegate
객체 사용)
Responding to the Launch of Your App
iOS 12 이하 버젼에서는 scene을 지원하지 않기에 UIKit은 모든 life-cycle 관련 이벤트들을 UIApplicationDelegate
객체에게 전달합니다
App delegate는 App에 존재하는 모든 window들을 관리합니다
결과적으로, App의 상태 변화는 외부 display의 content를 포함한 전체 UI에 영향을 미칩니다
🔘 App Life Cycle
Unattached
ForegroundInactive
ForegroundActive
Background
Suspend
🔘 일반적인 흐름
App을 launch하면, 시스템은 App을 일단 inactive
혹은 background
상태에 놓습니다 (UI가 화면에 나타나야 하는지 아닌지에 따라)
foreground
로의 launch가 완료되면, 시스템은 App을 자동으로 Active
상태로 만듭니다
그 후의 상태는 App이 종료될 때까지 Active
와 Background
사이를 왔다갔다합니다
Launch 시점
App의 data 구조와 UI를 초기화
Responding to the Launch of Your App
Activation 시점
UI 설정을 완료하고 유저 interaction을 준비
Preparing Your UI to Run in the Foreground
DeActivation 하자마자
data를 저장하고 App의 동작을 정지시킴
Preparing Your UI to Run in the Background
Background에 진입하자마자
중요한 작업은 끝내고, 메모리는 가능한 한 해제시키며 App의 snapshot을 준비한다
Preparing Your UI to Run in the Background
Termination 시점
모든 작업을 즉시 멈추고 공유 자원을 해제
applicationWillTerminate(_:)
안녕하세요 너무 좋은 글 감사합니다.
혹시 스터디 노션에 정리하고 공유를 해도 될까요 ? 출처는 해당 링크로 밝히겠습니다.