SeSAC 수업에서 앱의 생명주기에 대해서 배우고 한 번쯤은 자세하게 볼 필요성을 느껴 공식문서와 서치를 통해 정리해 보려고 한다.
수업내용과 아래의 공식문서를 중점으로 앱의 생명주기에 대해 다루어보았다.
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
Managing your app’s life cycle | Apple Developer Documentation
Respond to system notifications when your app is in the foreground or background, and handle other significant system-related events.
developer.apple.com
1. 앱의 생명주기(LifeCycle)란?
앱의 생명주기는 앱이 실행되는 동안 다양한 상태를 거치며 변화하는 것을 의미한다.
앱의 현재 상태에 따라 언제든지 앱이 수행할 수 있는 작업과 수행할 수 없는 작업을 결정하기에 이는 중요하다.
예를 들면 foreground app은 유저의 주목을 받기에 실행되는 기능들이 우선적으로 수행될 것이고, 반대로 background app은 최소한의 작업만을 수행할 것이다(유저에게 보이지 않기에).
그렇기에 앱의 상태 변화에 따라서 적절한 동작을 수행할 수 있도록 조정하는 것이 사용자에게 더 나은 앱 환경을 제공할 것 같다.
2. iOS 13 이전 app-based life-cycle events
우선 iOS 13 이전과 이후로 차이가 있는데, 이전부터 살펴보려고 한다.
iOS 13 이전에는 앱 기반 생명주기로 구성되어 있었다.
UIkit에서는 UIApplicationDelegate
가 모든 생명주기 events를 담당했다.
이를 쉽게 말하자면, 앱의 상태의 변화(앱이 눈에 보이는 것, 안 보이는 것 등)가 앱의 전체 UI에 영향을 미쳤다는 의미이다. 즉 디스플레이에 표시되는 콘텐츠를 포함하여 앱의 모든 화면과 인터페이스에 영향을 미치는 것이다.
아래의 그림은 iOS 13 이전의 앱 상태변화이고, 공식문서에서 가져왔다.
앱을 실행시키기 전에는 그 어떠한 것도 시작되지 않았기에 Not Running 상태이다.
- Not Running: 앱이 시작되기 전 상태 → 아이폰의 어떤 영역도 차지하지 않는 상태이다.
이후 앱을 실행하고자 클릭하면 inactive 상태나 background 상태가 된다
- Inactive: 앱이 화면에서 실행 중이나 어떤 신호도 받지 않는 상태
- Background: 앱이 화면에서 보이진 않지만 코드를 실행하고 있는 상태
→ UI가 화면에 나타날 준비가 되었는지 여부에 따라 준비가 되었다면 Inactive, 되지 않았다면 background상태가 된다.
이후 앱의 상태는 Inactive였을 경우 Active상태가 되는데, 사용자의 상호작용과 시스템의 동작에 따라 active에서 background로 변하기도, backgroud에서 active상태로 전환되기도 한다.
- Active: 앱이 화면에서 실행 중인 상태
→ iOS 13 이전에는 하나의 앱만이 Active 상태로 동작할 수 있었다.
앱을 종료하면 Suspended상태로 들어가게 된다.
- Suspended: 앱이 곧 종료될 상태
처음에 들었을 때는 헷갈려서 이해를 돕기 위해 서치 한 사진을 가져왔다 (하단에 출처참고)
굳이 따지자면 공식문서와 조오금 다른 것 같긴 하지만..
쉽게 이해하기에 더 좋은 사진 같다. 위 사진과 같이 Inactive와 active상태를 합쳐서 Foreground라고 한다. 반대로 Background상태는 똑같이 Background입니다.
3. iOS 13 이후 scene-based life-cycle events
원래는 여기까지만 알면 되는 개념이었는데,, iOS13이 발표되면서 iPadOS가 발표되었다.
더 이상 하나의 앱에 하나의 화면이라는 개념이 변하게 된 것이다.
예를 들어서 이제는 iPad에서 굿노트를 두 개의 화면으로 분할해서 쓸 수 있는 것처럼 말이다.
그러면서 이전에는 life-cycle events를 AppDelegate
에서 모두 다뤘는데 iOS13을 기점으로 SceneDelegate
가 등장하게 된다.
역할을 구분하자면 앱의 생명주기와 프로세스 이벤트는 여전히 AppDelegate
가 관리하지만, UI 생명주기는 새로운 SceneDelegate
가 담당하게 된 것이다.
해당 사진이 iOS13 이전의 AppDelegate의 역할이다.
그리고 iOS13 이후의 SceneDelegate와 역할이 나눠지게 되었다.
여기서 Scene
이라는 개념이 등장하게 되는데, 한 개의 Scene
은 사용자가 기기에서 실행하는 앱의 UI를 나타내는 하나의 인스턴스를 말한다.
전에 언급했듯이, 이전에는 하나의 앱이 하나의 인스턴스를 가지고 있었기 때문에 앱이 실행 중인 동안에는 하나의 UI만 사용할 수 있었다. 하지만 iOS13 이후부터 멀티플 윈도우를 지원하면서 하나의 앱이 여러 개의 Scene
인스턴스를 가질 수 있게 된 것이다.
각 Scene
은 자체적으로 생명주기를 갖고 있다. 앱은 하나 이상의 SceneDelegate
를 가질 수 있게 구성되어 있다. 이를 통해 각 Scene
은 독립적으로 UI 상태를 관리하고, 사용자에게 편리한 멀티플 윈도우 환경을 제공할 수 있게 된 것이다.
해당 내용은 WWDC19 Architecting Your App for Multiple Windows 에서 더 자세히 알아볼 수 있다.
아래사진은 iOS13 이후 각 Scene에 대한 상태변화이다.
사용자나 시스템이 앱에 새로운 scene을 요청하게 되면, UIKit은 해당 scene을 만들어 Unattached
상태로 변경시킨다.
이후 사용자가 요청한 scene은 실제 화면에 보이는 Foreground
로 움직인다. 반면 시스템이 요청한 scene은 일반적으로 Background
로 움직여 event를 처리한다.
사용자가 앱의 UI를 해제하면, UIKit은 scene을 Background
상태로 옮기고, 결국 Suspended
상태에 도달하게 된다.
UIkit은 Background
나 Suspended
된 scene을 언제든지 리소스들을 회수하기 위해 Unattached
상태로 연결을 해제할 수 있다. *이는 여러 개의 scene을 관리하면서 메모리 효율을 위해 필요에 따라 scene과 관련된 리소스를 해제하는 과정이다.
배운 내용을 다시 정리하자는 가벼운 마음에서 시작했지만.. 공식문서랑 같이 보다 보니 어렵다ㅠㅜ
아직 배워나가는 과정이기 때문에 잘못된 부분 있으면 알려주시길 바랍니다.
참고
1. Apple Document Managing Your App's Life Cycle