앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정함.
예를 들어, 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 비롯한 시스템 리소스보다 우선순위를 갖는다.반면 백그라운드 앱은 화면 밖에서 작동하므로 가능한 한 작업을 적게 수행해야 하며, 가급적 아무것도 수행하지 않는 것이 좋다.
앱의 상태가 변경되면 그에 따라 앱의 동작을 조정해야 한다. 앱의 상태가 변경되면 UIKit은 적절한 델리게이트 객체의 메서드를 호출하여 사용자에게 알림.
ㅤ
✔️ iOS 13 버전 혹은 그 이후 버전
Scene 기반 앱의 생명 주기 이벤트에 응답하기 위해 UISceneDelegate 객체를 사용한다.
✔️ iOS 12 버전 혹은 그 이전 버전
UIApplicationDelegate 객체를 사용하여 생명 주기 이벤트에 응답한다.
생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기 까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻한다. 앱의 상태는 앱이 현재 어떠한 것을 할 수 있는가를 결정한다.
앱의 실행/종료 및 앱이 Foreground/Background에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태가 전환되는 일련의 과정을 뜻한다.
앱의 상태는 총 다섯가지로 구분할 수 있다.
NotRunning
Foreground - Inactive
Foreground - Active
Background - Running
Background - Suspended
앱이 Scene을 지원하는 경우 각각의 분리된 Scene의 UI Life Cycle event들은 SceneDelegate로 전달됨. Scene은 기기에서 실행되는 앱 UI의 한 인스턴스를 나타냄. 사용자는 각 앱에 대해 여러개의 Scene을 생성하고 개별적으로 보이거나 숨길 수 있음. 각 Scene에는 고유한 생명주기가 있으므로 각 Scene은 서로 다른 상태에 있을 수 있음. 예를 들면 한 Scene은 Foreground에, 다른 Scene은 Background에 있을 수 있는 것
Scene 지원은 opt-in 기능이기 때문에 사용하려면 앱의 Info.plist 파일에 UIApplicationSceneManifest Key를 추가해야함.
사용자 혹은 시스템이 앱에 새로운 Scene을 요청하면 UIKit는 Scene을 생성하고 unattached 즉 연결되지 않은 상태로 설정한다. 사용자가 요청한 Scene은 Foreground로 빠르게 이동하여 화면에 보여지며, 시스템이 요청한 Scene은 일반적으로 이벤트를 처리할 수 있도록 Background로 이동함
- 앱 실행
앱이 실행되면 앱을 화면에 보여주기 위한 모든 설정이 끝나고 다음 메소드가 호출됨
application(_: didFinishLaunchingWithOptions:)
- Scene 연결
앱이 실행되면 UIKit에 Scene을 연결해야함.
Scene이 연결되고 화면에 나타나기 까지 다음의 순서 대로 메소드들이 호출됨
application(:configurationForConnecting: options: )
scene(_:willConnectTo:options: )
sceneDidBecomeActive(_:)
- 앱 실행 후 홈 화면으로 나가면 : Active - Inactive - Background (-Suspended)
앱 실행 후 홈 화면으로 나가면 Active 에서 Inactive를 거쳐 Background 상태로 전환됨.
이 때, SceneDelegate는 Scene 다음의 순서 대로 메소드들이 호출됨
sceneWillResignActive(_:)
sceneDidEnterBackground(_:)
- Background 상태에 있는 앱을 다시 실행하면 : Background - Inactive - Active
Background 상태에 있는 앱을 다시 실행하면 InActive를 거쳐 Active 상태로 전환됨.
이 때, SceneDelegate는 시스템에 다음 메소드를 호출하도록 요청함
sceneWillEnterForeground(_:)
sceneDidBecomeActive(_:)
- Scene 연결 해제
기존 App-Based LifeCycle에서는 멀티태스킹 창(app Switcher)에서 swife-up 제스처를 사용해서 앱을 종료시켰음.
하지만 Scene을 사용할 때에는 Multi Window를 지원하기 때문에 앱이 둘 이상의 Scene Window를 가진다면, swift-up 제스처는 앱을 종료시키지 않고 Scene을 해제시키게 됨. 만약 모든 Scene의 연결이 해제되었다면 앱이 종료됨.
Scene 연결이 해제될 때는 다음 순서로 메소드가 호출됨
sceneDidDisconnected(_:)
application(_: didDiscardSceneSessions:)
applicationWillTerminate(_:)
모든 프로세스와 UI Life Cycle events는 모두 App Delegate로 전달됨
Launch 후 시스템은 UI가 화면에 표시될지 여부에 따라 앱을 비활성 또는 백그라운드 상태로 전환한다.
- 앱 실행 : Not Running - Inactive - Active
앱이 실행되면 Not Running 상태에서 Inactive를 거쳐 Active 상태로 전환됨.
이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함.
application(_:didFinishLaunchingWithOptions:)
applicationDidBecomeActive(_: )
- 앱 실행 후 홈 화면으로 나가면 : Active - Inactive - Background (-Suspended)
앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background 상태로 전환됨.
이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함
applicationWillResignActive(_:)
applicationDidEnterBackground(_:)
- Background 상태에 있는 앱을 다시 실행하면 : Background - Inactive - Active
Background 상태에 있는 앱을 다시 실행하면 InActive를 거쳐 Active 상태로 전환됨.
이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함
applicationWillEnterForeground(_:)
applicationDidBecomeActive(_:)
- 앱 종료: (Some State) - Background or Suspended - Not Running
사용자가 직접 앱을 종료시키는 경우, 앱은 다시 Not Running 상태로 돌아감.
이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함
applicationWillTerminate(_:)