iOS) 애플리케이션의 Life Cycle
App’s Life Cycle
1. iOS 13 이후
- UISceneDelegate 객체를 사용하여 scene-based app 의 life-cycle 에 응답
- 앱이 scenes 를 지원하는 경우 UIKit 은 각각에 대해 별도의 life-cycle 이벤트를 제공.
scene : 기기에서 실행되는 app’s UI 의 한 인스턴스.
- app 에 대한 여러개의 scenes 을 만들고 별도로 보여주거나 숨길 수 있다. 왜냐면 고유한 life-cycle 이 존재하기 때문이다. 예를들어 한 장면은 foreground 에 있고 나머지 장면들은 background 혹은 일시중단 될 수 있다.
Scene support 는 opt-in(선택적) 기능이다. Info.plist 파일에 UIApplicationSceneManifest 키를 추가하면 사용 가능.
- 멀티 윈도우 기능을 이야기한다. 아이패드 등에서 활용.
- 유저나 시스템이 앱의 새로운 scene 을 요청하면 UIKit 은 이를 생성하고 ‘Unattached’ 상태로 둔다.
- 유저의 요청된 scenes 은 ‘Foreground’ 로 빠르게 옮겨진다. 시스템이 요청한 scene 은 ‘Background’ 로 이동하여 이벤트를 처리한다.
- 예를 들어 시스템은 ‘Background’ 에서 scene 을 실행하여 location event 를 수행할 수 있다.
-
유저가 앱을 닫으면(dismiss) UIKit 은 관련 scene 을 ‘Background’ 상태로 이동하고 ‘Suspended’ 된다. UIKit 은 리소스를 회수하기 위해 ‘Background’ 나 ‘Suspended’ 된 scene 연결을 끊고 ‘Unattached’ 상태로 반환한다.
-
다음은 상태전환을 보여준다.
- Unattached (시스템이 connection notification 을 주기 전까지는 이 상태 유지. 메모리를 점유하고 실행중인 상태.)
- ForegroundInactive (앱이 실행중, event 를 받지 않는 상태)
- ForegroundActive (앱이 실행중, event 를 받고있는 상태. 다른 상태로 전환되는 동안에 이 상태를 통과하게 된다. 예를 들어 시스템 알람이 오거나 창을 내리거나 app-switching 상태에 있는 경우 등)
- Background (앱이 백그라운드에서 실행되고 있는 상태)
- Suspended (앱이 백그라운드에 있으며, 아무것도 실행되지 않는 상태. 메모리 점유중하지만 대기 상태)
- App delegate 와 차이점
- background에서만 Unattached가 됩니다. (AppDelegate 에서는 suspended 나 background 상태에서 not running 가능.)
- 화살표들의 차이
- Scene delegate에서는 Suspended에서 바로 Inaction로 가는 화살표 없음.
- Scene delegate에서 Unattached에서 inactive 될때 실선. inactive에서 active가 될때 점선.
- Scene delegate에서 Unattached에서 background가 될때 실선입니다.
- 점선의 경우에는 특별한 event 없이도 시스템이 자동으로 수행해주는 상태의 전환이라고 할 수 있다.
- 실선의 경우에는 사용자나 시스템에 의해 발생한 event로 인해서 발생하는 상태의 전환이라고 할 수 있다.
2. iOS 12 이전
- UIApplicationDelegate 객체를 사용하여 life-cycle 에 응답
- iOS 12 이하 버전에서는 scene 지원하지 않는다. UIKit 은 모든 life-cycle 이벤트를 UIApplicationDelegate 로 전달한다.
- launch 후 시스템은 UI 가 화면에 표시되는지 여부에 따라서 app 을 inactive 또는 background state 로 전환.
- foreground 로 런칭할 때 시스템은 자동으로 active 상태로 전환. 그 후에는 app 이 종료전까지 active 와 background 에서 변동한다.
- Not Running (앱이 시작되지 않았거나 시스템에 의해 종료된 상태. 메모리에도 없고 프로세스 관점에서도 아무것도 실행되지 않는다.)
- Inactive (앱이 실행 중, event를 받지 않는 상태)
- Active (앱 실행 중, event 받는 상태)
- Background (앱이 백그라운드에 있지만 코드가 실행되고 있는 상태)
- Suspended (앱이 백그라운드에 있으며, 아무것도 실행되지 않는 상태. 메모리 점유중하지만 대기 상태)
scene, window, view 의 관계
- UIScene 은 app UI 의 객체이며, window 와 view controller(View) 를 포함
- UIWindow 는 app UI 의 뒷 배경. view 에 이벤트를 보내는 객체이다
- UIView 는 화면에서 사각형 모양의 content 를 관리하는 객체이다
- 출처 : https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
- 출처 : https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports
- 출처 : https://jercy.tistory.com/11?category=728321
- 출처 : https://velog.io/@minni/iOS-Application-Life-Cycle