오늘은 App Life Cycle에 대해서 정리해보자.
사실 더 전에 정리했어야 했는데 어쩌다보니 이제 한다...ㅋㅋ
그리고 이걸 설명하면은 SceneDelegate도 정리해야한다.... 할게 태산...ㅋㅋㅋ
iOS 공부하다보면 위의 그림을 한 번씩은 보게 된다.
iOS App Life Cycle 그림이다.
오늘도 공식 문서를 보면서 정리해보자.
이름 그대로 App의 생애 주기이다.
App이 foreground 혹은 background에 있을 때 시스템 알림에 응답하고 기타 중요시스템 관련 이벤트를 처리한다.
App의 현재 상태에 따라 언제든지 할 수 있는 작업과 할 수 없는 작업이 결정된다.
예를 들어, foreground 상태의 app은 사용자에게 보이는 상태로 CPU를 포함한 시스템 리소스에서 우선권을 갖는다.
반대로 background 상태의 app은 화면에 보이지 않는 상태로 가능한 작은 작업을 수행해야하고, 가급적이면 아무것도 수행하지 않는 것이 좋다.
App의 상태가 변하면 그에 따라 동작을 조정해야 한다.
App의 상태 변화는 delegate를 통해 UIKit가 알려준다.
흐음... 정리하자면 foreground는 사용자에게 보이는 상태로 자원의 우선권을 갖는다.
반면에 background는 사용자에게 보이지 않는 상태로 작은 작업만을 수행하도록 해야 한다.
iOS 13 이상부터는 UISceneDelegate 객체로, iOS 12 이하는 UIApplicationDelegate 객체로 생명 주기 이벤트를 받을 수 있다.
App이 scenes을 지원한다면 UIKit은 각각의 scenes에 별도의 life cycle 이벤트를 제공한다.
scenes는 디바이스에서 실행 중인 앱 UI의 한 인스턴스이다.
각 scenes은 각자 고유한 life cycle이 존재하므로 각 scenes은 각자 다른 실행 상태일 수 있다.
따라서 사용자는 각 App애에 대해 여러 scenes을 생성하고 개별적으로 표시하거나 숨길 수 있다.
예를 들어 한 scenes은 foreground에 있고, 다른 scenes은 background에 있거나 일시정지될 수 있다.
위의 그림은 포스팅 맨 처음 그림에서도 봤다!ㅋㅋ
이는 scene의 상태 변화를 보여주는 그림이다.
사용자나 시스템이 App에 새로운 scenes을 요청하면 UIKit은 해당 scene을 만들지만 unattached한 상태로 둔다.
이후 사용자가 요청한 scenes는 foreground로 이동해 화면에 보이도록 한다.
시스템에서 요청한 scenes라면 일반적으로 이벤트를 처리할 수 있도록 background로 이동한다.
예를 들어, 시스템은 위치 이벤트를 처리하기 위해 백그라운드에서 scenes를 시작할 수 있다.
사용자가 App의 UI를 닫으면 (흠... App을 끄거나 홈화면으로 돌아가는 경우를 말하는거 같다.) UIKit은 해당 scenes를 background로 이동하고 suspended(일시 정지) 상태로 변경한다.
UIKit은 언제든 background 혹은 suspended된 scenes의 연결을 끊어 리소스를 회수하고 unattached한 상태로 돌릴 수 있다.
공식 문서에서 UIScene class가 enum으로 위에서 본 state들을 가지고 있는 것을 확인할 수 있다.
iOS 12 이전 버전과 Scenes을 지원하는 않는 App에서 UIKit은 모든 수명주기 이벤트를 UIApplicationDelegate 객체에 전달한다.
app delegate는 App 화면에 표시되는 window와 아래의 모든 screen들을 관리한다.
결과적으로 app 상태 전환은 외부 디스플레이의 콘텐츠를 포함한 App의 전체 UI에 영향을 준다.
아래 그림은 app delegate 개체를 포함한 상태 전환을 보여준다.
App이 실행된 후 시스템은 UI가 화면에 표시 될 것인지 여부에 따라 App을 inactive 혹은 background 상태로 전환한다.
foreground로 시작할 때에는 시스템은 App을 자동으로 active 상태로 전환한다.
이후 App이 종료될 때까지 active와 background 상태 사이에서 전환된다.
unattached
에서 foreground
와 background
전환은 실선이다.not running
에서 foreground
와 background
전환은 점선이다.어디가 다를까?
unattached
상태로 두고, 이후 사용자가 요청한 scenes는 foreground
로 이동해 화면에 보이도록 하고 시스템에서 요청한 이벤트를 처리해야하면 background
로 이동한다.inactive
혹은 background
상태로 전환한다.호오... 그렇다면 Scene-Based는 사용자의 요청이나 시스템 event에 따라 전환되고, App-Based는 시스템이 자동으로 전환해주는구나..!
그럼 실선은 사용자의 요청이나 시스템의 event에 의해 전환되는 경우고, 점선은 시스템에 의해 자동으로 전환되는 경우이다.
unattached
, suspended
, not running
의 차이는 뭘까?
드디어 App Life Cycle에 대해 정리했다.
나중에 헷갈릴때마다 꺼내봐야지...
그럼 이만👋