앱의 생명 주기 (App Life Cycle)
앱의 생명 주기는 포그라운드 또는 백그라운드 상태에 있을 때 앱의 실행 & 종료를 시스템 이벤트 의해 앱의 상태가 전환되는 과정을 말한다.
예를 들어 사파리로 웹 검색을 하다가 전화가 와서 받으면화면의 상태가 전화기 모드로 넘어가고, 사파리 웹은 사라지는 전환을 정의한 것이다.
앱의 상태
현재 앱이 언제든지 수행 가능 또는 불가능한 작업을 결정한다.
- NotRunning
앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태
- Foreground - Inactive
Inactive는 앱이 실행중이지만 사용자로부터 이벤트를 받을 수 없는 상태이다.
멀티태스킹 윈도우로 진입하거나 앱 실행중 전화, 알림 등에 의해 앱을 사용할 수 없게 되는 경우 이 상태로 진입한다.
- Foreground - Active
Active는 앱이 실제 실행중이고 사용자 이벤트를 받아서 상호작용할 수 있는 상태이다.
바로 Active상태는 될 수 없으며 Inactive 상태를 거쳐서 Active 상태가 된다.
- Background - Running
Background는 홈 화면으로 나가거나 다른 앱으로 전환되어 현재 앱이 실질적인 동작을 하지 않는 상태이다. 예를 들어 뮤직 앱을 닫아도 재생한 음악이 계속 실행되는 경우, 사용자가 앱을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업을 이 상태에서 할 수 있다.
- Background - Suspended
Suspended는 앱을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해서 메모리에 관련 데이터만 저장되어 있는 상태이다. 앱이 Background 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입하게 된다. (보통 2-3초 이내)
Suspended 상태의 앱들은 iOS의 메모리가 부족해지면 가장 먼저 메모리에서 해제된다. 따라서 앱을 종료시킨 적이 없더라도 앱을 다시 실행하려고 하면 처음부터 다시 실행된다.
UISceneDelegate 생명주기 메서드
앱의 상태는 현재 수행이 가능한 동작과 그렇지 못한 동작을 구분한다.
예를 들어 포그라운드 상태인 앱이 화면을 점유하고 있을 경우, 사용하고 있을 경우에는 시스템 리소스보다 높은 우선순위를 갖는다.
반대로 백그라운드에 있는 앱의 경우는 최소한으로 수행해야 한다.
또한, 앱의 상태가 변경된다면 이에 맞는 동작을 수행해야 한다.
이러한 상태 변화와 관련된 생명주기를 iOS 13부터는 UISceneDelegate 객체를 이용해 관리한다.
iOS 13부터는 AppDelegate의 역할 중 UI 상태를 알 수 있는 UILifeCycle에 대한 부분을 SceneDelegate가 맡았다.
대신 AppDelegate는 Session LifeCycle 에 대한 역할이 추가되었다.
여기서 Session LifeCycle은 두 개의 메소드가 존재하는데, Scene Session이 생성 또는 삭제 될 때 AppDelegate에 알리는 역할을 한다.
Scene Session은 앱에서 생성한 모든 Scene에 대한 정보를 관리한다.
⭐ iOS13부터 AppDelegate가 하는 일?
- 앱의 가장 중요한 데이터 구조를 초기화하는 것
- 앱의 scene을 환경설정(Configuration)하는 것
- 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)에 대응하는 것
- 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것
- 애플 푸쉬 알림 서비스, 위치서비스, 앱종료와 같이 실행시 요구되는 모든 서비스를 등록하는것
⭐ iOS13부터 SceneDelegate가 하는 일?
- 앱 Scene기반 생명 주기 이벤트를 관리
⭐앱 실행 및 종료와 관련된 Process Life Cycle은 AppDelegate
⭐앱이 Foreground와 Background 상태에 있을 때 상태 전환과 관련된 UI Life Cycle은 SceneDelegate에서 관리한다.
AppDelegate.swift
1. didFinishLaunchingWithOptions(앱이 처음 실행될 때) - 위의 이미지에서 파란색 1번 의미
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
Not Running 상태의 초기 App을 실행할 때 사용자에게 화면(Scene)이 보일 수 있도록 Foreground 영역에 접근하는 메서드이며, App화면이 보이기 직전에 호출된다.
2. configurationForConnecting(새로운 Scene을 생성할 때 호출) - 위의 이미지에서 파란색 2번 의미
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
새로운 화면(Scene)을 생성할 때 호출된다.
iOS12 이전에는 하나의 디바이스에서 단일 화면(Scene)만이 존재할 수 있었지만 iOS13부터 하나의 디바이스(iPad)에 여러 화면을 가질 수 있게 되었다.(iPad의 멀티태스킹)
3. didDiscardSceneSessions - 위의 이미지에서 파란색 3번 의미
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
화면의 세션이 제거되기 직전에 호출되는 메서드
화면을 영구적으로 메모리에서 해제될 때만 해당 메서드가 호출된다.
(Background에 있는 App이 종료되려고 할 때 (Background에 있는 App이 종료되려고 할 때 호출되는 메서드는 applicationWillTerminate: 메서드이다.)
SceneDelegate.swift
0. scene() (Scene이 해당 App에 추가될 때)
그림에는 나와있지 않은 단계
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}
화면(Scene)이 해당 App에 추가(연결)될 때 호출되는 메서드이다.
초기 화면을 지정하거나 Window를 설정한다.
1. sceneDidBecomeActive() - 위의 이미지에서 빨간색 1번 의미
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
화면(Scene)을 InActive에서 Active로 이동시킬 때 호출되는 메서드
App을 처음 실행할 때 사용자가 해당 App을 100% 조작할 수 있도록 시켜주는 메서드
해당 메서드는 Foreground영역에서만 동작한다
- window를 보여줘야하는 경우
- ViewController를 전환해야 하는 경우
- 뷰와 컨트롤러의 데이터 값과 상태를 업데이트 해야 하는 경우
- 일시 중지된 상태를 다시 재개해야 하는 경우 (게임, 이미지 다운로드 등)
2. sceneWillResignActive() - 위의 이미지에서 빨간색 2번 의미
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
화면(Scene)을 Active에서 InActive로 이동시킬 때 호출되는 메서드
App 사용중 전화 또는 문자등의 특정 이벤트가 발생하면 해당 App의 화면은 이 메서드를 통해 Active에서 InActive로 이동한다
해당 메서드는 Foreground 영역에서만 동작한다
3. sceneDidEnterBackground() - 위의 이미지에서 빨간색 3번 의미
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
화면(Scene)을 InActive에서 Background영역으로 이동시킬 때 호출되는 메서드.
4. sceneWillEnterForeground() - 위의 이미지에서 빨간색 4번 의미
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
화면(Scene)을 Background에서 Foreground(InActive)영역으로 이동시킬 때 호출되는 메서드
5. sceneDidDisconnect() - 위의 이미지에서 빨간색 5번 의미
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}
화면(Scene)이 해제될 때 호출되는 메서드.
해당 메서드는 App의 화면이 Background영역에 들어간 직후 또는 화면의 세션이 버려질 때 호출되는 메서드이다.
(메모리로부터 영구적으로 버려지는건 아니다. 사용자가 해당 화면에 다시 접근할 여지가 있기 때문이다. 완젼한 App종료는 아님.)
- Foreground mode는 시스템 리소스에 높은 우선순위를 가지며 foreground상태의 앱이 리소스를 할당받고 사용할 수 있도록 운영체제는 background앱을 종료하기도 한다.
- Background mode는 가능한 적은 메모리 공간을 사용해야하며 일부 앱(음악앱 등..)을 제외하면 background mode가 아닌 suspend 상태가 된다. 이런 앱들은 운영체제에 의해 종료될 수 있다.
'UIKit > 기본' 카테고리의 다른 글
네비게이션 바 + 탭 바 적용 (0) | 2024.03.29 |
---|---|
Drawing Cycle (+ Layout Cycle) (0) | 2024.03.28 |
ViewController의 life cycle (1) | 2024.03.27 |
컴플리션 핸들러 - 비동기 처리 (함수가 끝난 후 결과 알려줄 때) (0) | 2024.03.19 |
Delegate Pattern (델리게이트 패턴) (1) | 2024.03.18 |