App Life Cycle

이원희·2021년 3월 12일
1

📱 iOS

목록 보기
24/24
post-thumbnail

오늘은 App Life Cycle에 대해서 정리해보자.
사실 더 전에 정리했어야 했는데 어쩌다보니 이제 한다...ㅋㅋ
그리고 이걸 설명하면은 SceneDelegate도 정리해야한다.... 할게 태산...ㅋㅋㅋ

iOS 공부하다보면 위의 그림을 한 번씩은 보게 된다.
iOS App Life Cycle 그림이다.
오늘도 공식 문서를 보면서 정리해보자.

App Life Cycle

이름 그대로 App의 생애 주기이다.

App이 foreground 혹은 background에 있을 때 시스템 알림에 응답하고 기타 중요시스템 관련 이벤트를 처리한다.
App의 현재 상태에 따라 언제든지 할 수 있는 작업과 할 수 없는 작업이 결정된다.

예를 들어, foreground 상태의 app은 사용자에게 보이는 상태로 CPU를 포함한 시스템 리소스에서 우선권을 갖는다.
반대로 background 상태의 app은 화면에 보이지 않는 상태로 가능한 작은 작업을 수행해야하고, 가급적이면 아무것도 수행하지 않는 것이 좋다.

App의 상태가 변하면 그에 따라 동작을 조정해야 한다.
App의 상태 변화는 delegate를 통해 UIKit가 알려준다.

  • iOS 13 이상에서는 UISceneDelegate 객체를 사용해 scene-based app의 생명주기 이벤트를 받을 수 있다.
  • iOS 12 이하에서는 UIApplicationDelegate 객체를 사용해 app의 생명주기 이벤트를 받을 수 있다.

흐음... 정리하자면 foreground는 사용자에게 보이는 상태로 자원의 우선권을 갖는다.
반면에 background는 사용자에게 보이지 않는 상태로 작은 작업만을 수행하도록 해야 한다.
iOS 13 이상부터는 UISceneDelegate 객체로, iOS 12 이하는 UIApplicationDelegate 객체로 생명 주기 이벤트를 받을 수 있다.


Scene-Based Life-Cycle Events

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한 상태로 돌릴 수 있다.

❗️scene 상태 전환을 사용하여 다음과 같은 작업을 수행할 수 있다고 Apple이 알려준다.

  • UIKit이 scenes을 App에 연결하면 초기 UI를 구성하고 scenes에 필요한 데이터를 로드
  • foreground-active 상태로 전환할 때 UI를 구성하고 사용자와 상호 작용할 준비할 때
  • foreground-active 상태를 벗어날 때 데이터를 저장하고 App동작을 조용하게 할때
  • background 상태로 진입할 때 중요한 작업을 완료하고 가능한 한 많은 메모리를 확보하고 App 스냅샷을 준비
  • scene 연결이 끊어지면 scene과 관련된 모든 공유 리소스를 정리
  • 화면과 관련된 이벤트 외에도 UIApplicationDelegate 개체를 사용해 App 시작에 응답해야 한다.

Scene-Based Life-Cycle State

공식 문서에서 UIScene class가 enum으로 위에서 본 state들을 가지고 있는 것을 확인할 수 있다.

  • unattaced: scenes는 unattached 상태에서 시작되고 시스템이 연결 알림을 보낼 때까지 해당 상태를 유지한다.
    scenes는 사용자가 app switcher로 인터페이스를 dismiss하거나 자원을 회수할때 다시 attached 상태가 된다.
  • foregroundActive: scenes이 foreground에서 실행 중이고 이벤트를 받을 수 있는 상태이다.
    active scene은 화면과 사용자에게 표시된다.
  • foregroundInactive: scenes이 foreground에서 실행 중이지만 이벤트는 받을 수 없는 상태이다.
    scenes다른 상태로 이동하는 동안 foregroundInactive 상태를 거쳐 가게된다.
  • background: scenes이 화면에 표시되지 않고 background에서 실행 중인 상태이다.

App-Based Life-Cycle Events

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 상태 사이에서 전환된다.

❗️App 전환을 사용하여 다음과 같은 작업을 수행할 수 있다고 Apple이 알려준다.

  • 시작시 App의 데이터 구조와 UI를 초기화
  • active시 UI 구성을 완료하고 사용자와 상호 작용할 준비
  • inactive시 데이터를 저장하고 App 동작을 조용히 함
  • background 진입 시 중요한 작업을 완료하고 가능한 한 많은 메모리를 확보하고 App 스냅 샷을 준비
  • 종료시 모든 작업을 즉시 중지하고 공유 리소스를 해제

Life cycle로 돌아와보자

어떤 기준으로 점선과 실선이 나뉘었을까?

  • Scene-Based에서 unattached에서 foregroundbackground 전환은 실선이다.
  • App-Based에서 not running에서 foregroundbackground 전환은 점선이다.

어디가 다를까?

  • UIKit는 scene을 만들고 unattached 상태로 두고, 이후 사용자가 요청한 scenes는 foreground로 이동해 화면에 보이도록 하고 시스템에서 요청한 이벤트를 처리해야하면 background로 이동한다.
  • App이 실행된 후 시스템은 UI가 화면에 표시될 것인지 여부에 따라 App을 inactive 혹은 background 상태로 전환한다.

호오... 그렇다면 Scene-Based는 사용자의 요청이나 시스템 event에 따라 전환되고, App-Based시스템이 자동으로 전환해주는구나..!

그럼 실선사용자의 요청이나 시스템의 event에 의해 전환되는 경우고, 점선시스템에 의해 자동으로 전환되는 경우이다.

Unattached, Suspended, Not Running의 차이는?

unattached, suspended, not running의 차이는 뭘까?

  • unattached: scene이 delegate로 부터 연결 노티피케이션을 받기 전까지는 unattached 상태를 유지한다.
    메모리를 점유하고 있고, 실행 중인 상태이다.
  • suspened: App이나 Scene이 background에 있고 아무것도 실행되지 않는 상태이다.
    즉, 프로세스 대기 상태로 메모리는 점유하지만 대기중인 상태이다.
  • not running: 아예 App이 실행되지 않았거나 실행되었지만 종료된 상태이다.
    메모리도 없고, 프로세스도 실행되지 않는 상태이다.

마무리

드디어 App Life Cycle에 대해 정리했다.
나중에 헷갈릴때마다 꺼내봐야지...
그럼 이만👋

0개의 댓글