iOS App Life Cycle

Jisu·2023년 9월 7일
0

iOS

목록 보기
4/9
post-thumbnail

App Life Cycle

앱 라이프 사이클이란 앱을 시작하고 앱이 종료되기 전까지 앱이라는 프로세스가 가질 수 있는 여러 상태들을 뜻한다.

어플리케이션 하나를 눌러서 시작했다고 생각해보자. 우리는 그 앱에서 필요한 것만 수행하고 바로 종료하는 것이 아니라, 앱을 사용하다가 카톡이 오면 백그라운드로 넘기고 카톡 앱에서 채팅을 하고 다시 앱으로 돌아온다.
음악을 듣고 있다면 제어센터를 열어서 볼륨을 조절하기도 하고 어두운 곳이라면 밝기도 조절한다. 그 때 마다 이 앱에서 어떤 일이 일어나는지 살펴보자

UIKit App Life Cycle

AppDelegate

UIKit으로 프로젝트 파일을 만들면 App Delegate와 SceneDelegate 파일이 자동으로 생성되어있다.

iOS 13 이전 버전에서는 앱의 라이프 사이클은 AppDeleage라느 객체가 관리했었다고 한다. 하지만 iOS 13 이후 부터 앱의 상태 관리에 대한 책임은 SceneDelegate로 넘어갔다.

하지만 앱의 시작직후, 그리고 종료직전을 관리하는 것은 여전히 App Delegate에서 하고 있다.

구조는 UIAppDelegate 프로토콜을 채택하고 있고, 마치 TalbeView나 CollectionView에서 프로토콜을 채택해서 그 안의 내용을 구체화해서 사용했던 방식이라 같다.
image

현재의 AppDelegate는 다음과 같은 역할을 한다고 한다.

  1. 앱의 가장 중요한 데이터 구조를 초기화
  2. 앱의 scene을 환경설정(Configuration)하는 것
  3. 이벤트를 수신하고 그를 VC나 View에 전달하는 것
  4. 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)에 대응하는 것
  5. 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것.
  6. 애플 푸쉬 알림 서브스와 같이 실행시 요구되는 모든 서비스를 등록하는것.

SceneDelegate

만약 아이패드를 사용해서 메모장같은 앱을 사용하면 아래 그림처럼 두개의 뷰로 나눠서 사용할 수 있고 하나의 앱을 실행시켰음에도 불구하고 각기 다른 UI를 가질 수 있다.
image

이처럼 앱의 UI를 관리하는 객체를 UIWindowScene이라고 하고 하나의 앱에서 여러 Scene을 가질 수 있다.
iOS 13이후부터는 이 Scene이 앱의 라이프 사이클을 담당하게 되었다.

image

파일을 만들자마자 앱의 상태에 관련된 5개의 델리게이트 메소드들이 기본으로 구현되어있고 앱의 상태에 따라서 이 메소드들이 호출된다.

차례대로 아래와 같이 선언되어 있고 Scene의 상태에 따라 호출된다. 이름을 보면 어떤 때 호출이 될지 알 수 있다.

  1. scene - 앱 시작
  2. sceneDidDisconnect - 앱 종료
  3. sceneDidBecomeActive - 다른 앱에서 스위칭 되거나 홈화면에서 다시 들어올 때
  4. sceneWillResignActive - 제어센터를 내리거나 알람을 받았을 때
  5. sceneWillEnterForeground - 앱으로 돌아왔을 때
  6. sceneWillEnterBackground - 홈화면으로 돌아가거나 다른 앱으로 스위칭했을 때

Scene State

Scene의 상태는 공식 문서에 소개된 바와 같이 4가지로 나뉠 수 있다.
image

UnAttached

UI를 담당하는 Scene이 아직 앱에 연결되지 않은 상태이다. 따라서 메모리를 점유하고 있긴 하지만 아직까지 앱에 UI가 보여지지 않는 상태이다.

Foreground Inactive

Scene이 앱에 연결되어 UI를 보여주고 있지만 이벤트는 수신하지 않는 상태이다. 시스템에 알람이 오거나, 제어센터를 내리거나 사용하던 앱을 바꿀 때 이런 상태가 된다.

Foreground Active

유저가 정상적으로 앱을 사용하고 있는 상태로 UI도 잘 보여지고 이벤트도 잘 수신하고 있다.

Background

앱을 실행하고 있지만 UI는 보이지 않는 말그대로 백그라운드 상태이다. 스포티파이 같은 앱의 음악은 계속 이 상태에서 실행되는 것이다.

공식문서의 그림에는 이렇게 되어있다.

image

** Suspended 상태는 그림에는 나와있지만 Scene Enum에는 명시되어있지않다. background 상태에서 추가작업이 없다면 suspended 상태로 진입한다고 한다.


SwiftUI App Life Cycle

SwiftUI에서도 동일한 Scene의 개념을 사용하지만 delegate로 관리하지않고 환경변수의 key 값으로 접근해 값을 받고 메소드 체이닝 방식으로 관리한다.

UIKit과는 다르게 InActive, Active, Background 3가지 phase만 존재한다.

image

앱 스위치 화면에 들어간다면 InActive,
앱을 사용하는 상태로 들어가면 Active,
아이폰의 홈 화면으로 돌아가면 Bakcground 상태로 처리된다.

UIKit처럼 호출함수가 세분화되어있지는 않으나 더 직관적인것을 볼 수 있다.

UIKit에서 앱 상태에 따른 호출 함수 실험은 아래 블로그에 자세히 나와있다

정리

image

UIKit App Life Cycle

References

App Life Cycle관련 블로그 글
Manging App Life Cycle - Apple 공식 문서
SwiftUI App Life Cycle
UIKit App Life Cycle 관련 블로그 글

profile
비즈니스에 관심많은 DevOps Engineer 장지수입니다.

0개의 댓글