iOS

iOS Application Life Cycle

JoonSwift 2021. 1. 18. 01:53

이번 포스팅에서는 iOS의 Application Life Cycle에 대해서 공부한 부분을 정리해 보도록 하겠습니다. 😄

애플 공식문서의 'Managing Your App's Life Cycle' 이라는 Article을 주로 살펴 볼 예정입니다. 

 

우선! iOS 13 이후 버전 부터는 Scene이라는 개념이 만들어 지고, UISceneDelegate 개체들을 Scene-based 앱의 life-cycle 이벤트에 대응하기 위해 사용하고 있습니다. 

Scene은 하나의 프로세스에 여러개가 존재할 수 있고, Scene 하나하나마다 Life Cycle을 따로 가지고 있기 때문에, 하나의 앱에서 여러개의 Scene이 각각 다른 상태에서 동작이 가능합니다. 

예를들어, 어떤 Scene 하나는 Foreground상태에서 유저들의 이벤트를 처리하고 있는 상태라면, 다른 Scene은 Background나 Suspended상태에서 Scene의 역할을 하고있을 수 있다는 이야기 입니다. 

 

Life Cycle State

Unattached

우선 Unattached 상태에 대해서 알아보겠습니다. Unattached는 Scene이 현재 앱에 연결되어 있지 않다(Not currently connected)는 것을 나타내고 있는 상태입니다. 

앱은 Scene이 연결되지 않은 상태에서 시작하며, 시스템이 연결 알림을 보낼 때까지 Unattached상태를 유지합니다.

Foreground - Inactive

다음은 Foreground-Inactive 상태입니다. Scene이 Foreground에서 실행중이며, event를 받을 수 없는 상태를 나타냅니다.

Scene이 다른 상태로 전환할 때 전환 과정에서 주로 Foreground-Inactive 상태를 거쳐서 갑니다.

Foreground - Active

Foreground-Active 상태 즉 Inactive와는 다르게, Foreground에서 실행중이며 event를 받을 수 있는 상태를 나타냅니다.

Active상태의 Scene에 대한 인터페이스가 화면에 보여지고, 사용자에게도 보여집니다. 

Background

Background상태는 Scene이 Background에서 동작중이며, 화면에는 보여지지 않고 있는 상태입니다. 

Background상태의 Scene은 보여지는 인터페이스가 없습니다.

Suspended

보통 Suspended상태는 Background상태에 있던 Scene이 시스템에 의해서 Suspended상태로 옮겨집니다. 메모리에는 남아있지만 별다른 동작 코드를 실행시키고 있지 않은 상태를 나타냅니다.

Not Runniing

Not Running! 말그대로 앱이 실행되고 있지 않다는 의미입니다.

시스템이 앱을 종료시켰을 수도 있고, 사용자가 직접 앱을 종료시킬 수도 있습니다.


이제는 Managing Your App's Life Cycle 글에서 나오는 그림을 보면서 정리해 보겠습니다. 

애플 공식문서 'Managing Your App's Life Cycle'

위 그림은 Scene의 다양한 상태 전환을 보여주고 있는 그림입니다.

 

우선 유저 또는 시스템이 앱에게 새로운 Scene을 요청했을 때, UIKit은 Scene을 만들어서 Unattached 상태에 둡니다. 

사용자가 요청한 Scene은 빠르게 Foreground-Inactive 상태를 거쳐 화면에 보여지는 Foreground-Active 상태로 이동합니다.

또한, 시스템이 요청한 Scene은 일반적으로 Background상태로 이동하여 Background에서 처리할 수 있는 이벤트들을 처리할 수 있게 합니다. 

예를들어, 어떤 앱을 사용하는데 위치 관련 이벤트를 처리해야 한다면, Scene을 Background에서 실행시켜 그 이벤트들을 처리할 수 있게 할 수 있습니다. 

유저가 앱의 UI를 사라지게 하면, UIKit은 연결된 Scene을 Background 상태로, 상황에 따라서는 시스템에 의해서 Suspended 상태로 이동할 수도 있습니다. 

UIKit은 언제든지 Background 혹은 Suspended상태의 Scene의 연결을 끊고, 필요한 자원을 회수할 수 있으며, Scene을 Unattached 상태로 돌릴 수 있습니다. 

 

이러한 화면 전환을 통해 다음과 같은 다양한 작업을 수행할 수 있습니다.

  • UIKit이 앱에 Scene을 연결하면, Scene의 초기 UI와 Scene에 필요한 데이터를 가져오는 설정을 합니다. 
  • Foreground - Active 상태로 바뀌는 과정에서, UI를 설정하고, 유저와 상호작용 할 준비를 합니다. 
  • Froeground - Active 상태를 떠나는 동안에는, 데이터를 저장하고, 앱의 동작을 조용하게(quiet)? 합니다.
  • Background 상태로 가는 과정에서는, 주요한 작업들을 끝내고, 가능한 많은 메모리를 확보한 후, 앱의 스냅샷을 찍을 준비를 합니다. (스냅샷은 App Switcher에 활용)
  • Scene이 Disconnected되면, Scene과 관련된 공유 자원들을 모두 없애버립니다. 
  • Scene-related 이벤트 외에도, UIApplicationDelegate 개체를 사용하여 앱 시작에 응답해야 합니다. 

 

Scene-Based App의 Life Cycle에 관한 내용을 간단하게 살펴보았습니다. 

틀린 부분이나 수정해야할 부분이 있다면 댓글에 남겨주시면 감사하겠습니다! 🙌