iOS. App Life Cycle

sanghee·2021년 12월 17일
0
post-custom-banner

매주 진행하는 면접스터디에서 아래의 질문들에 대한 정리를 모은 글입니다.
Interview_Question_for_Beginner/iOS
오늘의 Swift 상식 (앱 생명주기)

앱 생명주기란?

앱의 실행부터 종료까지의 주기를 말한다. 앱이 foreground나 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리하는 단계들을 말한다.

📌앱 생명주기

앱의 Main Run Loop는 모든 사용자가 발생시키는 이벤트에 따라 처리된다. 이벤트가 발생했을 때, UIKit에 의해 설정된 Port를 통해 내부의 Event queue에 이벤트를 담아놓고, 담겨있는 이벤트를 Main Run Loop에서 하나하나씩 실행한다.

아래 그림은 앱의 Main Run Loop의 구조와 사용자 이벤트에 의해 수행되는 조치의 결과이다. 예시는 touch event이고 다른 이벤트들 또한 비슷한 원리로 동작된다.

UIApplication 객체는 앱이 실행될 때, 이벤트가 처리될 때, View기반의 인터페이스에서 업데이트가 발생할 때 setup된다.

이름에서 볼 수 있듯이 Main Run Loop는 앱의 Main Thread를 실행하며 앱을 돌면서 모든 이벤트를 처리한다. 이를 위한 다음과 같은 규칙들이 있다.

  • UIApplication은 앱이 생성될 때 생성되며 죽을 때까지 절대 죽지 않는다. 즉, 무한 Loop이기 때문에 코드 내에 무한 Loop를 만들면 안된다.
  • Delegate 객체는 어떤 상황이 되기 직전이나 직후에 호출된다.
  • Application Delegate가 Life Cycle를 전달받으며 Application Delegate를 통해 현재 상태를 알 수 있다.
  • 앱은 window를 최소 한 개 이상 가지고 있다.
  • window와 root view controller가 함께 맨 처음 흰 화면을 띄운다.

📌앱 상태 5가지

아래의 그림에서 점선은 시스템이, 실선은 사용자가 하는 것이다.

1. Not Running

아무것도 실행하지 않은 상태이다. 또는 실행중이지만 시스템에 의해 종료된 상태이다.

2. InActive

앱이 포어그라운드 상태로 돌아가지만, 이벤트는 받지 않는 상태이다. 앱의 상태 전환 과정에서 잠깐 머무는 단계이다.

3. Active

일반적으로 앱이 돌아가는 상태이다. 이벤트를 받는 단계이다.

4. Background

앱이 Suspended(유예 상태) 상태로 진입하기 전 거치는 단계이다.

Background 일때 작업하는 경우가 많다.

음악이나 통화와 같이 계속 앱이 실행되는 경우에는 Background일 때 동작을 한다.

보통의 앱은 Background 단계는 스쳐지나가서 바로 Suspended가 된다.

5. Suspended

앱이 Background 상태에 있지만, 아무 코드도 실행하지 않는 상태이다. 시스템이 임의로 Background 상태의 앱을 Suspended 상태로 만든다. 리소스가 해제된다.

Launch screen은 코드를 가질 수 없다.

Suspended가 되면 Not Running과 같다고 봐야 한다.

Background로 들어가면 앱이 종료되었다고 봐야 한다.

Background에서 다시 InActive로 가는 경우를 권장한다. 즉, 앱의 데이터가 저장되어 있으면 그 화면을 보여주게 한다. 그러나 은행앱은 보안을 위해 바로 종료되어 처음부터 로그인하도록 동작한다.

상태 변경 예시

  • Active → Inactive → Background(Running) → Suspend: 앱이 활성화 상태에서 비활성화 상태로 변경되고, 백그라운드에서는 계속 실행중었다가 정지되었다.
  • Running → InActive → Active: 백그라운드에서 실행중인 앱이 다시 포어그라운드에서 활성화되었다.
profile
👩‍💻
post-custom-banner

0개의 댓글