iOS

iOS) App Life Cycle

snowe 2021. 4. 8. 16:58

App Life Cycle이란 앱이 fore ground 또는 back ground에있을 때 시스템 알림에 응답하고 시스템이 발생시키는 Event에 의해 App의 상태가 전환되는 일련의 과정을 말한다.

참고: fore ground / back ground에 있을 때의 제약사항에 대한 이전 포스팅

 

 

App Life Cycle은 다음과 같이 총 다섯 가지의 상태로 이루어져 있다.

1. Not Running

앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태.

 

2-1. Fore ground-Inactive

앱이 실행중이지만 사용자로부터 event를 받을 수 없는 상태.

multitasking window로 진입하거나 앱 실행중 알림 등에 의해 사용할 수 없게 되는 경우 이 상태로 진입.

iOS 14가 되면서 휴대폰 사용중에 전화가 올 경우, Inactive가 되던 기존의 방식에서 팝업 형식으로 전환이 되었는데 그때는 앱을 정상적으로 사용할 수 있기 때문에 Active 상태일 것 같다.

 

2-2. Fore ground-Active

Active는 앱이 실제 실행중이고 사용자 event를 받아서 상호작용할 수 있는 상태(항상 Inactive 상태가 선행된 후 Active상태로 전환된다.)

 

3-1. Back ground-Running

홈화면으로 나가거나 다른 app으로 전환되어 현재 app이 실질적인 동작을 하지 않는 상태.

 

사용자가 상호작용을 하고 있지는 않지만 음악 앱과 같이 back ground에서도 재생한 음악이 계속 실행되는 경우, 혹은 사용자가 앱을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업이 이루어진다.

 

3-2. Back ground-Suspended

앱을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해 메모리에 관련 데이터만 저장되어있는 상태.

앱이 background 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입하게 된다.

 

Suspended 상태의 앱들은 iOS의 메모리가 부족해지면 가장 먼저 메모리에서 해제되는데, multitasking window에 있는 앱인데도 다시 실행하면 처음부터 실행되는 상황을 겪어본 적 있을것이다 이것이 메모리 부족으로 인해 Suspended가 된 상황이다(애플은 빨리 램에 관대해져라).

 

 

 

App Life Cycle- Scenario

앱의 Life Cycle 시나리오는 다음과 같다(각 메서드들은 iOS) AppDelegate, SceneDelegate 포스팅에서도 다루었습니다!).

1. 사용자가 앱을 실행합니다: Not Running → In-Active → Active

application(_:didFinishLaunchingWithOptions:)

앱이 실행되고 앱을 화면에 띄우기 위한 모든 설정이 완료된 뒤, 실제로 화면에 나타나기 직전에 호출.

⬇️

앱 실행 후 UIKit에 Scene 연결 과정을 밟음

application(_:configurationForConnecting:options:)
새로운 Scene을 만들고 UIKit과 연결하기 위한 configuration을 지정.

이 메서드는 앱 시작시 호출되지 않고, 새 장면 혹은 새 창을 가져야 하는 경우에만 호출된다.

⬇️

scene(_:willConnectTo:options:)
Scene이 연결될 것임을 delegate에 알려준다.

기존에 application(_:didFinishLaunchingWithOptions:)에서 했던 UIWindow 생성 작업을 이 method에서 할 수 있다.

⬇️

sceneDidBecomeActive(_:)
앱이 Inactive에서 Active 상태로 전환되었을 때 호출(화면에 나타남).

 

2. 앱 실행 도중 홈으로 나갑니다: Active → In-Active → Background

sceneWillResignActive(_:) 앱이 Active에서 Inactive 상태로 전환될 때 호출.

⬇️

sceneDidEnterBackground(_:) 앱이 Background 상태로 전환되었을 때 호출.

 

2-1. 앱을 다시 켭니다: Background → Active

sceneWillEnterForeground(_:) 앱이 Background에서 Inactive 상태로 전환될 때 호출.

⬇️

sceneDidBecomeActive(_:) 앱이 Inactive에서 Active 상태로 전환될 때 호출.

 

2-2. 앱을 종료합니다 : Background or Suspended → Not Running

iOS 12까지는 multi window를 지원하지 않았기 때문에 멀티 태스킹 창에서 Swipe-up을 통해 앱을 종료 시켰다.

하지만 iOS 13부터 multi window를 지원하고 만약 앱이 둘 이상의 Scene Window를 갖는다면 Swipe-up은 앱을 종료시키는 것이 아니라 Scene을 해제시킨다. 그렇게 Scene이 모두 해제 되면 앱이 종료된다!

 

sceneDidDisconnected(_:) UIKit에 연결된 Scene의 연결 해제를 delegate에 요청.

⬇️

application(_:didDiscardSceneSessions:) 사용자가 멀티태스킹 화면에서 한개 이상의 Scene을 종료시켰을 때 호출.

⬇️

applicationWillTerminate(_:) 앱이 사용자에 의해 종료될 때 호출(시스템에 의한 예기치 못한 종료시에는 호출되지 않음).

 

 

 

 

참고자료

 

Apple Developer Documentation

 

developer.apple.com