앱 라이프 사이클이란 앱을 시작하고 앱이 종료되기 전까지 앱이라는 프로세스가 가질 수 있는 여러 상태들을 뜻한다.
어플리케이션 하나를 눌러서 시작했다고 생각해보자. 우리는 그 앱에서 필요한 것만 수행하고 바로 종료하는 것이 아니라, 앱을 사용하다가 카톡이 오면 백그라운드로 넘기고 카톡 앱에서 채팅을 하고 다시 앱으로 돌아온다.
음악을 듣고 있다면 제어센터를 열어서 볼륨을 조절하기도 하고 어두운 곳이라면 밝기도 조절한다. 그 때 마다 이 앱에서 어떤 일이 일어나는지 살펴보자
UIKit으로 프로젝트 파일을 만들면 App Delegate와 SceneDelegate 파일이 자동으로 생성되어있다.
iOS 13 이전 버전에서는 앱의 라이프 사이클은 AppDeleage라느 객체가 관리했었다고 한다. 하지만 iOS 13 이후 부터 앱의 상태 관리에 대한 책임은 SceneDelegate로 넘어갔다.
하지만 앱의 시작직후, 그리고 종료직전을 관리하는 것은 여전히 App Delegate에서 하고 있다.
구조는 UIAppDelegate 프로토콜을 채택하고 있고, 마치 TalbeView나 CollectionView에서 프로토콜을 채택해서 그 안의 내용을 구체화해서 사용했던 방식이라 같다.
만약 아이패드를 사용해서 메모장같은 앱을 사용하면 아래 그림처럼 두개의 뷰로 나눠서 사용할 수 있고 하나의 앱을 실행시켰음에도 불구하고 각기 다른 UI를 가질 수 있다.
이처럼 앱의 UI를 관리하는 객체를 UIWindowScene이라고 하고 하나의 앱에서 여러 Scene을 가질 수 있다.
iOS 13이후부터는 이 Scene이 앱의 라이프 사이클을 담당하게 되었다.
파일을 만들자마자 앱의 상태에 관련된 5개의 델리게이트 메소드들이 기본으로 구현되어있고 앱의 상태에 따라서 이 메소드들이 호출된다.
차례대로 아래와 같이 선언되어 있고 Scene의 상태에 따라 호출된다. 이름을 보면 어떤 때 호출이 될지 알 수 있다.
Scene의 상태는 공식 문서에 소개된 바와 같이 4가지로 나뉠 수 있다.
UI를 담당하는 Scene이 아직 앱에 연결되지 않은 상태이다. 따라서 메모리를 점유하고 있긴 하지만 아직까지 앱에 UI가 보여지지 않는 상태이다.
Scene이 앱에 연결되어 UI를 보여주고 있지만 이벤트는 수신하지 않는 상태이다. 시스템에 알람이 오거나, 제어센터를 내리거나 사용하던 앱을 바꿀 때 이런 상태가 된다.
유저가 정상적으로 앱을 사용하고 있는 상태로 UI도 잘 보여지고 이벤트도 잘 수신하고 있다.
앱을 실행하고 있지만 UI는 보이지 않는 말그대로 백그라운드 상태이다. 스포티파이 같은 앱의 음악은 계속 이 상태에서 실행되는 것이다.
** Suspended 상태는 그림에는 나와있지만 Scene Enum에는 명시되어있지않다. background 상태에서 추가작업이 없다면 suspended 상태로 진입한다고 한다.
SwiftUI에서도 동일한 Scene의 개념을 사용하지만 delegate로 관리하지않고 환경변수의 key 값으로 접근해 값을 받고 메소드 체이닝 방식으로 관리한다.
UIKit과는 다르게 InActive, Active, Background 3가지 phase만 존재한다.
앱 스위치 화면에 들어간다면 InActive,
앱을 사용하는 상태로 들어가면 Active,
아이폰의 홈 화면으로 돌아가면 Bakcground 상태로 처리된다.
UIKit처럼 호출함수가 세분화되어있지는 않으나 더 직관적인것을 볼 수 있다.
UIKit에서 앱 상태에 따른 호출 함수 실험은 아래 블로그에 자세히 나와있다
App Life Cycle관련 블로그 글
Manging App Life Cycle - Apple 공식 문서
SwiftUI App Life Cycle
UIKit App Life Cycle 관련 블로그 글