앱은 현재 상태에 따라 수행할 수 있는 작업인지, 아닌지 결정합니다.
예를들어 foreground
상태의 앱이 유저의 주목을 받기 때문에 CPU를 포함한 시스템 리소스보다 좀 더 우선순위가 높습니다.
하지만, background
상태의 앱은 화면 안에 없기 때문에 최소한의 작업을 수행하며 가급적이면 아무것도 하지 않아야 합니다.
우리는 앱 상태의 변화에 맞춰 동작들을 조정해야 합니다.
만약 앱 상태가 변하게 된다면, UIKit
은 적합한 delegate
객체의 메소드를 통해 우리에게 알려줍니다.
iOS 13 혹은 그 이후 버전일때, scene을 지원한다면 iOS는 항상
Scene Delegates
를 사용할 것입니다.
그러나 iOS 12 혹은 그 이전 버전이라면, 시스템은App Delegate
를 사용합니다.
Manage multiple instances of your app’s UI simultaneously, and direct resources to the appropriate instance of your UI.
즉, 앱 UI의 인스턴스를 동시에 관리하고, 리소스를 적절한 UI의 인스턴스로 보낸다고 하는데 확실히 와닿지는 않습니다.
개요를 살펴보겠습니다.
UIKit은 UIWindowScene객체를 사용하여 앱 UI의 인스턴스를 관리합니다.
Scene은 우리의 UI중 하나의 인스턴스를 나타내기 위한 window와 viewcontroller를 포함합니다.
각각의 Scene은 또한 UIKit과 앱간의 상호 작용을 조정하는데 사용하는 UIWindowSceneDelegate 객체를 갖고있습니다.
Scene은 동시에 실행되며, 같은 메모리를 공유하고 앱 프로세스 공간을 공유합니다.
결과적으로 단일 앱은 여러개의 Scene과 Scene delegate객체가 동시에 활성화 될 수 있습니다.
앱이 Scene을 지원한다면 UIKit은 다양한 생명주기 이벤트를 각각 Scene에게 제공합니다.
유저는 각각의 앱마다 여러개의 Scene을 만들 수 있고 각 Scene마다 보여지거나 숨길 수 있습니다.
왜냐하면 각각의 Scene은 그들만의 생명 주기를 갖고 있기 때문입니다. 따라서, 이 Scene들을 각각 다른 실행 상태에 놓일 수 있습니다.
Scene support is an opt-in feature. To enable basic support, add the UIApplicationSceneManifest key to your app’s Info.plist file as described in Specifying the Scenes Your App Supports.
opt-in이란 옵트인(Opt-in)은 당사자가 개인 데이터 수집을 허용하기 전 까지 당사자의 데이터 수집을 금지하는 제도
라고 합니다.
Scene support란 사용자의 동의를 얻어야 사용할 수 있는 기능입니다.
Basic support를 사용하려면 UIApplicationSceneManifest
의 key를 앱의 Info.plist
파일에 추가해야 합니다. 자세한 설명은 다음 링크를 참고하세요.
밑에 보이는 그림은 여러 Scene
들의 상태 전환을 보여드립니다.
사용자 혹은 시스템이 당신의 앱에 새로운 Scene
을 요구하면, UIKit
은 새로 생성하고 Unattached
상태로 둡니다.
그리고 유저가 요청한 Scene(User-requested)
은 재빠르게 화면에 표시되는 foreground
로 오게됩니다.
시스템이 요청한 Scene(System-requested)
은 일반적으로 이벤트를 처리할 수 있도록 background
로 이동합니다.
예를 들어 시스템이 Scene
을 background
에서 시작시켜 location event
를 처리 할 수 있습니다.
사용자가 앱의 UI를 닫으면, UIKit
은 관련된 Scene
을 background
로 이동시키고 결국은 suspended
상태로 이동시킵니다.
UIKit은 언제든지 background 혹은 suspended 상태에 있는 Scene들을 연결을 끊고 리소스를 회수하고 unattached 상태로 반환할 수 있습니다.
iOS12 혹은 그 이전 버젼들은 scene을 지원하지 않습니다. 그리고 UIKit은 모든 생명주기 관련 이벤트들을 UIApplicationDelegate 객체에 전달합니다.
밑에 사진을 보면 앱 delegate
객체와 관련된 상태 전환을 보여줍니다.
실행 이후, 시스템은 UI가 화면에 표시 되는지 안되는지에 따라 앱을 inactive
혹은 background
상태로 전환합니다.
foreground
상태로 시작하게 되면, 시스템은 자동으로 앱을 active
상태로 전환합니다.
그 후, 앱이 종료되기 전까지 앱의 상태는 active
와 background
사이에서 수시로 변하게 됩니다.
activation
일 때, UI설정을 끝내고 유저와 상호작용할 준비를 한다.deactivation
상태가 되면, 데이터를 저장하고 앱 동작들을 조용하게합니다. background
상태에 돌입하게 되면, 중요한 작업들을 끝내고, 가능한 많은 메모리를 확보하고, 앱 스냅샷을 준비한다.UIApplicationDelegate
객체를 사용하여 몇가지 중요한 이벤트들을 다루어야 한다.
출처: https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle