티스토리 뷰
안녕하세요 Pingu입니다~🐧
iOS 앱은 처음 실행되고 종료될 때까지의 Life Cycle이 존재합니다. 앱이 background에 가거나 foreground로 진입하는 것도 모두 App Life Cycle의 일부분이죠.
이번 글에서는 이러한 App Life Cycle에 대해 알아보려고 합니다.
참고로 View Controller의 Life Cycle이랑은 전혀 다른 별개의 Life Cycle이며 View Controller의 Life Cycle은 여기를 참고해주세요~
앱은 현재 Life Cycle의 상태에 따라 할 수 있는 작업과 할 수 없는 작업으로 나뉩니다.
상태에 따라 어떤일을 할 수 있는지에 대한 내용은 여기에 정리해뒀어요.
따라서 이러한 상태가 변화될 때 특정 클래스의 메서드를 통해 알리게 되는데요, iOS 13에서 Scene Delegate가 나오게 되면서 이러한 역할을 UISceneDelegate가 하게 됐습니다. iOS 12까지는 UIApplicationDelegate가 해왔는데 말이에요. 이에 따라 변화된 내용은 여기를 참고해주세요~
어쨌든 이번 글에서는 App Life Cycle에 대해 알아볼 거니까 거기에 집중하도록 할게요.
iOS 13부터는 Scene이라는 개념이 도입되었고 때문에 하나의 앱이 여러 개의 Scene을 가질 수 있게 되었습니다.
따라서 각 Scene마다 life Cycle이 존재하게 되는데요, 이러한 Scene은 아래와 같은 상태를 가질 수 있습니다.
일단 앱이 실행하는 관점에서 살펴보겠습니다.
1. 먼저 UIKit이 Scene을 앱에 연결합니다. 그런 뒤 Scene의 초기 UI를 구성하고 필요한 데이터를 로드합니다.
2. Foreground Active 상태로 전환할 때 UI를 구성하고 사용자와 상호작용할 준비를 합니다.
3. Foreground Active -> Foreground Inactive로 전환할 때는 데이터를 저장합니다.
4. Foreground에서 Background로 전환할 땐 중요한 작업을 완료하고 메모리를 확보한 뒤 현재 앱 UI를 스냅샷으로 준비합니다. 이 화면이 앱 전환기에서 보이는 그 화면입니다.
5. Scene과의 연결이 끊어지면 Scene과 관련된 모든 리소스를 정리합니다. -> Suspended 상태
이렇게 글로만 보면 뭔가 좀 이해가 안되기 때문에 실제 간단한 앱에서 이러한 작업들이 어떻게 진행되는지 살펴보겠습니다.
이렇게 앱을 실행하면 위와 같은 상태 전환이 발생합니다.
이때 호출되는 Scene delegate 메서드는 func sceneWillEnterForeground(_ scene: UIScene), func sceneDidBecomeActive(_ scene: UIScene) 입니다.
이 상태에서 앱 전환기로 가면 어떻게 될까요?
위에서 본 과정에서는 4번에서 스냅샷을 준비하는 과정이 됩니다. 아직은 앱이 background 상태가 된 것은 아니에요.
위와 같이 Foreground 상태에서 Active, Inactive 상태만 됩니다.
이때 호출되는 Scene delegate 메서드는 func sceneWillResignActive(_ scene: UIScene) 입니다.
위와 같이 아예 홈 화면으로 나가버리면 그때 background로 전환이 됩니다.
이때 호출되는 Scene delegate 메서드는 func sceneDidEnterBackground(_ scene: UIScene), func sceneDidBecomeActive(_ scene: UIScene) 입니다.
그러면 다시 앱을 실행하면 어떻게 될까요?
이렇게 다시 Scene이 앱과 연결되고 Foreground Active 상태가 됩니다.
이때 호출되는 Scene delegate 메서드는 func sceneWillEnterForeground(_ scene: UIScene), func sceneDidBecomeActive(_ scene: UIScene) 입니다.
그럼 앱을 아예 종료하면 어떻게 될까요?
이렇게 scene의 연결이 끊기게 되고 만약 scene이 하나였다면 앱도 종료되게 됩니다.
이때 호출되는 scene Delegate 메서드는 func sceneWillResignActive(_ scene: UIScene), func sceneDidDisconnect(_ scene: UIScene) 입니다!
이게 iOS 13 이후에서 Scene을 사용할 때의 App Life Cycle이고, iOS 12에서 AppDelegate가 이를 관리할 땐 조금 달라집니다.
위의 그림이 iOS 12까지의 App Life Cycle입니다.
아까와의 큰 차이는 크게 없는 듯하죠?
이번에도 앱의 실행 관점에서 과정을 살펴보겠습니다.
1. 시작 시 앱의 데이터와 UI를 초기화합니다.
2. Active상태가 되면 UI 구성을 완료하고 사용자와 상호작용할 준비를 합니다.
3. Inactivet 상태가 되면 데이터를 저장합니다.
4. Background 상태가 되면 중요한 작업을 완료하고 메모리를 확보한 뒤 앱 스냅샷을 준비합니다.
5. 앱을 종료하게 되면 모든 작업을 중지하고 공유 자원을 해제합니다.
아까와의 큰 차이점은 Scene의 차이입니다. iOS 12까지는 window를 여러 개 가질 수 없었기 때문에 반드시 하나의 앱은 하나의 window만 가졌었습니다. 따라서 이러한 차이를 보이게 되죠!
아까와 마찬가지로 실제로 앱을 만들어서 상태 전환 과정을 살펴보도록 하겠습니다.
Scene을 사용하면 안 되기 때문에 SceneDelegate를 삭제하고 info.plist에 scene관련 내용도 삭제해주시면 AppDelegate로 앱의 상태를 관리할 수 있습니다.
앱을 처음 키면 위와 같이 active 상태가 됩니다.
이때 호출되는 AppDelegate 메서드는 func applicationDidBecomeActive(_ application: UIApplicationUIApplication)입니다. 저는 여기서 func applicationWillEnterForeground(_ application: UIApplication)라는 메서드도 호출될 줄 알았는데 안되더라고요?
앱 전환기로 가게 되면 어떻게 될까요?
이렇게 active 상태를 포기하고 앱의 스냅샷을 준비합니다.
이때 호출되는 AppDelegate 메서드는 func applicationWillResignActive(_ application: UIApplication) 입니다.
이번엔 아예 홈으로 나가보겠습니다!
홈으로 나가버리면 앱이 background 상태가 됩니다.
이때 호출되는 AppDelegate 메서드는 func applicationWillResignActive(_ application: UIApplication), func applicationDidEnterBackground(_ application: UIApplication) 입니다.
그럼 다시 홈에서 앱을 실행해보겠습니다.
이렇게 다시 foreground 상태가 되며 Active 상태도 됩니다.
이때 호출되는 AppDelegate 메서드는 func applicationWillEnterForeground(_ application: UIApplication), func applicationDidBecomeActive(_ application: UIApplication) 입니다.
이제 마지막으로 앱을 완전히 종료해보겠습니다.
이게 바로 app이 terminate 되어 not running이 되는 과정입니다.
이때 호출되는 AppDelegate 메서드는 func applicationWillTerminate(_ application: UIApplication) 입니다.
확실히 앱을 실제로 만들어서 관리하니 쉽게 이해가 되는 거 같아요!
이렇게 iOS 13부터 Scene Delegate를 사용하여 앱의 생명주기를 관리할 때와 iOS 12까지 App Delegate를 사용하여 앱의 생명주기를 관리할 때의 차이에 대해 알아봤습니다.
감사합니다!
'iOS > iOS_Memo' 카테고리의 다른 글
[iOS 앱개발] NotificationCenter 사용법 (0) | 2021.02.28 |
---|---|
[iOS 앱개발] Swift와 Vapor로 서버 만들기 (0) | 2021.02.11 |
[iOS 앱개발] View Controller의 Life Cycle (0) | 2021.02.04 |
[iOS 앱개발] MPNowPlayingInfoPropertyElapsedPlaybackTime 오류 해결 방법 (0) | 2021.02.02 |
[iOS 앱개발] CALayer 알아보기 1 (0) | 2021.01.28 |
- Total
- Today
- Yesterday
- 자료구조
- mac
- 알고리즘
- pattern
- 앱개발
- DP
- 프로그래밍
- 아이폰
- 코딩테스트
- System
- 스위프트
- design
- 백준
- Swift
- Xcode
- 테이블뷰
- operating
- OS
- Combine
- operator
- 문법
- 코테
- IOS
- dfs
- BFS
- 동시성
- OSTEP
- Publisher
- Apple
- document
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |