App LifeCycle란?
App의 생명 주기는 App의 실행/종료 및 App이 foreground 또는 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리
AppDelegate (iOS 12 and earlier)
Appdelgate의 역할
- 앱의 중앙 데이터 구조를 초기화합니다.
- 앱의 장면을 구성합니다.
- 메모리 부족 경고, 다운로드 완료 알림 등과 같이 앱 외부에서 발생하는 알림에 응답합니다.
- 앱 자체를 대상으로 하는 이벤트에 응답하고 앱의 scene, view 또는 viewController와 관련이 없습니다.
Apple 푸시 알림 서비스와 같이 출시 시 필요한 서비스에 등록합니다.
앱의 상태 변화
Apple에서 정의하는 앱의 상태(App State)는 크게 5가지로 구분됩니다.
- Not Running: 아무것도 실행하지 않은 상태
- InActive: 앱이 Foreground 상태로 돌아가지만, 이벤트는 받지 않는 상태, 앱의 상태 전환 과정에서 잠깐 머무는 단계입니다.
- Active: 일반적으로 앱이 돌아가는 상태
- Background: 앱이 Suspended(유예 상태) 상태로 진입하기 전 거치는 상태,
- Suspended: 앱이 Background 상태에 있지만, 아무 코드도 실행하지 않는 상태, 시스템이 임의로 Background 상태의 앱을 Suspended 상태로 만듭니다.
주의할점
- Background 상태에서는 일부 필요한 추가 작업을 수행할 수 있습니다. 또한, Background 상태에서 앱을 실행하면 InActive 상태를 거치지 않고 앱이 실행됩니다.
- 앱이 죽는 것(Suspended 상태에서 Not Running 상태로 진입하는 것)에는 알림을 받을 수 없습니다. 또한 Background 상태에서 Suspended 상태로 진입할 때 willTerminate 메소드가 실행되지만 이 또한 기기를 재부팅하면 실행되지 않습니다.
Scene Delegate
scene의 개념
UIKit은 객체를 사용하여 앱 UI의 각 인스턴스를 관리 합니다.
scene는 당신의 UI의 하나의 인스턴스를 표시하기위한 window와 viewController가 포함되어 있습니다.
scene은 동일한 메모리와 앱 프로세스 공간을 공유하면서 동시에 실행됩니다. 결과적으로 단일 app에 여러 scene과 scene delegate objects가 동시에 활성화될 수 있습니다
앱의 상태 변화
App Delegate와 다른점은
-
App-based는 not running과 suspended사이에 화살표가 있는데,
Scene-based는 unattached와 suspended 사이 화살표가 없다
-
App-based는 suspended에서 inactive로 가는 화살표가 있었는데,
Scene-Based는 suspended에서 foreground inactive로 가는 화살표가 없다.
App's Life Cycle 관련 Delegate 함수들
1. appDelegate
- configurationForConnecting
새 scene을 만들 때 사용할 UIKit의 구성 데이터를 검색
- didDiscardSceneSessions
app switcher에서 하나 이상의 앱 장면을 닫았다고 알립니다.
- applicationDidBecomeActive
앱이 활성화되었음을 알립니다.
- applicationWillResignActive
앱이 곧 비활성화될 것임을 알립니다.
- applicationDidEnterBackground
앱이 이제 백그라운드에 있음을 알립니다.
- applicationWillEnterForeground
앱이 포그라운드로 진입하려고 한다는 것을 알립니다.
- applicationWillTerminate
앱이 종료되려고 할 때 대리자에게 알립니다.
2. SceneDelegate
- scene(UIScene, willConnectTo: UISceneSession, options: UIScene.ConnectionOptions)
앱에 장면 추가에 대해 알립니다
- sceneDidDisconnect
UIKit이 앱에서 scene을 제거했음을 알립니다
- sceneWillEnterForeground
scene이 Foreground에서 실행되기 시작하고 사용자에게 표시될 것임을 알립니다
- sceneDidBecomeActive
scene이 활성화되었으며 이제 사용자 이벤트에 응답하고 있음을 알립니다.
- sceneWillResignActive
장면이 활성 상태를 끝내고 사용자 이벤트에 대한 응답을 중지하려고 한다고 대리자에게 알립니다.
- sceneDidEnterBackground
scene이 백그라운드에서 실행 중이며 더 이상 화면에 표시되지 않음을 알립니다.
viewController의 lifecycle
view 관리
-
init
Nib 파일을 사용하여 뷰 컨트롤러에 대한 뷰를 지정합니다.
nib 파일을 사용하면 단일 뷰 컨트롤러의 뷰를 지정할 수 있지만 뷰 컨트롤러 간의 segue 또는 관계를 정의할 수는 없습니다.
nib 파일은 또한 뷰 컨트롤러 자체에 대한 최소한의 정보만 저장합니다.
-
loadview
메서드를 사용하여 뷰 컨트롤러에 대한 뷰를 지정합니다.
이방법에서 프로그래밍 방식으로 보기 계층을 만들고 해당 계층의 루트 보기를 보기 컨트롤러의 속성에 할당합니다.
-
viewdidload
컨트롤러의 뷰가 메모리에 로드된 후 호출됩니다.
view 관련 알림 관리
view의 visibilty가 변경되면 viewController는 자동으로 자체 메서드를 호출하여 하위 클래스가 변경 사항에 응답할 수 있습니다.
view가 화면에 표시되도록 준비하고 변경 사항이나 기타 상태 정보를 저장 하는 데 사용하는 것과 같은 방법을 사용합니다.
- viewWillAppear
view가 view 계층에 추가될 것임을 뷰 컨트롤러에 알립니다.
- viewDidAppear
view가 view 계층에 추가되었음을 뷰 컨트롤러에 알립니다.
- viewWillDisappear
view가 view 계층에서 제거될 것임을 뷰 컨트롤러에 알립니다.
- viewDidDisappear
view가 view 계층에서 제거되었음을 뷰 컨트롤러에 알립니다.
출처 : https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle