앱의 상태는 App의 동작 여부를 결정한다.
언제 앱이 forground와 background로 이동하는지, 관련된 이벤트들이 어떤 것이 있는지 알아보려고 한다.
예를들어, foreground에 있는 앱은 현재 사용 중 이므로, CPU를 포함한 시스템 자원 사용에서 가장 높은 우선순위를 가진다. 반면에 앱이 Background에 있는 경우, 현재 사용자가 보고 있지 않은 상태로써, 최대한 적은 일을 수행한다.
이렇게 앱의 상태가 바뀜에 따라 적절히 대처해야한다.
앱의 상태가 바뀌었을 때, UIKit에서는 적절한 델리게이트 메소드를 호출해 준다.
각 scene은 현재 실행중인 앱인 하나의 인스턴스를 나타낸다. 사용자는 여러개의 scene을 사용할 수 있고, 독립적으로 사용이 가능하다. 각 scene은 각자 자신의 life-cycle을 가지고 있으므로 실행시 각기 다른 상태를 가진다.
위 그림은 scene의 상태 변화를 나타낸다. 사용자나 시스템이 새로운 scene을 요구할 때 UIKit은 scene을 생성하고 이것을 unattached 상태로 만든다.
요청 받은 사용자의 scene은 빠르게 foreground로 상태를 변경하고, 화면에 보여지게 된다.
요청 받은 시스템의 scene은 일반적으로 background 상태로 변경된다.
사용자가 App의 화면을 띄워 놓지 않을 때, UIKit은 관련된 scene을 background 또는 suspended 상태로 변경한다. UIKit은 언제든 background 또는 suspended 상태의 scene과의 연결을 끊을 수 있다.(이 때 앱의 상태는 Unattanched로 변경된다)
UIKit이 앱의 scene과 연결할 때, 초기 UI를 구성하고, 필요한 데이터를 로드한다.
foreground-active 상태로 변경될 때, UI를 구성하고, 사용자와 인터렉션을 준비한다.
- Scene-based UI : sceneDidBecomeActive(_:)
- other apps : applicationDidBecomeActive(_:)
foreground-active 상태를 벗어나면서, 데이터를 저장하고 앱을 Quit 한다.
- Scene-based UI : sceneWillResignActive(_:)
, sceneDidEnterBackground(_:)
- other apps : applicationWillResignActive(_:)
applicationDidEnterBackground(_:)
background 상태로 들어가면서 중요한 task를 종료시키고, 가능한 필요없는 메모리들을 해제한다. 또한,앱의 스냅샷을 준비한다.
- Scene-based UI : sceneWillResignActive(_:)
, sceneDidEnterBackground(_:)
- other apps : applicationWillResignActive(_:)
applicationDidEnterBackground(_:)
scene의 연결이 끊어질 때, scene과 관련되어 공유하고 있던 자원들을 모두 제거(clean) 한다.
(추가) scene과 관련된 이벤트들을 처리할 때, 반드시 UIApplicationDelegate객체를 사용하여 앱을 시작해야한다.
iOS 12 이전 버전들은 Scene을 지원하지 않는다. 따라서 UIKit에서 모든 life-cycle은 UIApplicationDelegate 객체가 관리한다.
앱 델리게이트는 앱의 모든 window들을 관리한다. 그 결과 앱의 상태는 앱의 전체적인 UI에 영향을 미친다.
위에 그림은 앱 델리게이트 객체와 관련하여 상태 변화를 보여준다.앱이 시작하면, 시스템은 앱을 inactive 또는 background 상태로 만든다.
앱이 foreground상태로 바뀌기 시작하면 시스템은 자동으로 앱을 active상태로 변경한다.
이후, 앱이 종료되기까지 active 상태와 background 상태로 계속해서 변경한다.
application(_:willFinishLaunchingWithOptions:)
application(_:didFinishLaunchingWithOptions:)
화면이 보여지기 까지의 과정을 print문을 이용하여 확인하고, 다음과 같이 도식화 하였다.