iOS에서 앱을 실행하면?
UIKit은 Objective-C 기반으로 되어 있기 때문에 내부에서 main 함수를 기반으로 돌아간다. 이 main 함수가 돌아가면서 `UIApplication`이 실행되고, 이 `UIApplication`은 singleton 형태로 생성되어 앱 전역에서 사용할 수 있다.
이후, 아래 사진의 Main Run Loop가 실행된다.
이 Main Run Loop가 돌아가면서 View에서 사람들의 event를 받고 update한다.
당연히! main Run Loop는 UI 관련 동작을 하기 때문에 Main Thread에서 동작한당.
앱의 생명 주기를 관리하기
개요
앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정한다.
예를 들어, 포그라운드 앱은 사용자의 관심을 받고 있기 때문에, CPU를 포함한 시스템 리소스보다 우선 순위를 갖는다. 반면, 백그라운드 앱은 화면 밖에서 작동하므로 가능한 적은 일을 실행하거나 아무것도 실행하지 않는 것이 좋다. 앱이 다른 상태로 변화한다면, 당신은 그것에 맞추어 적절히 행동을 조정해야 한다.
만약 당신의 앱 상태가 바뀌었다면, UIKit은 적절한 delegate 객체의 함수가 호출되는 것을 알려줄 것이다.
iOS 13 이후 버전에서, scene-based app에서 생명 주기 이밴트에 반응하기 위해 `UISceneDelegate` 객체를 사용한다.
iOS 12와 이전 버전에서, 앱에 생명주기 이벤트에 반응하기 위해 `UIApplicationDelegate`객체를 사용한다.
기존에 존재하던 AppDelegate에서 SceneDelegate로의 변화를 맞은 이유는, iOS 13에서 iPad의 멀티 윈도우를 지원하게 되었기 때문이다. 이전까지는 한 화면에 반드시 하나만 실행될 수 있던 Scene이 멀티 윈도우의 등장으로 한 화면에서 두 개의 앱이 실행 가능하게 된 것이다! 따라서, 기존의 `AppDelegate`로 UI life-cycle까지 책임지기에는 너무 비대해지므로 `SceleDelegate`가 UI life-cycle을, `AppDelegate`가 앱의 프로세스를 담당하는 구조로 변하게 되었다.
App 기반 앱의 생명 주기
말이 조금 웃기긴 하지만 번역이므로 넘어가도록 하장.
iOS 12 및 이전 버전에서는 Scene을 지원하지 않고, AppDelegate가 모든 생명주기 이벤트를 관리한다. 결과적으로, 앱의 상태 전환은 외부 디스플레이의 콘텐츠를 포함하여 전체 UI에 영향을 미치게 된다.
위 그림은 AppDelegate 객체와 관련된 상태 전환을 보여준다. 실행 후 시스템은 UI가 화면에 표시되는지 여부에 따라 background / `inActive` 상태로 나뉘게 되며, `foreground` 상태로 실행도면 시스템이 앱을 자동으로 `Active` 상태로 전환한다. 그 이후에는 앱이 종료될 때까지 `Active` 상태와 `background` 상태를 오가게 된다.
이후, `background` 상태에서 `suspend`, `Not Running` 상태로 이동할 수 있다.
- 앱의 생명 주기
- Not Running
- Foreground
- Active
- InActive
- Background
- Suspend
Scene 기반 앱의 생명 주기
만약 앱이 scene을 지원한다면, UIKit은 각각의 scene에 따른 분리된 생명 주기 이벤트를 전달할 것이다.
Scene은 디바이스에 동작하고 있는 앱의 UI의 인스턴스 하나를 보여준다. 유저는 각각의 앱의 다양한 scene을 만들 수 있으며, 따로따로 앱을 보이고 숨길 수 있다. 각각의 scene이 자신의 생명 주기를 가지고 있기 때문에, 각각의 앱은 다른 실행 상태를 가진다. 예를 들면, 하나의 scene은 `foreground`상태에 있지만 다른 앱들은 `background` 상태거나 `suspended` 상태에 있을 수 있다.
아래 그림은 Scene의 상태 전환을 보여준다. 사용자나 시스템이 앱의 새로운 Scene을 요청하면 UIKit은 이를 생성하고 InActive 상태로 둔다. 사용자가 요청한 장면은 Foreground Active 상태로 이동하여 화면에 나타난다. 시스템 요청 장면은 일반적으로 이벤트를 처리할 수 있도록 `background`로 이동한다.
예를 들어, 시스템은 위치 이벤트를 처리하기 위해 `background`에서 Scene을 실행할 수 있다. 사용자가 App의 UI를 닫으면 UIKit은 `background` 상태로 이동하고 결국 `suspend` 상태로 이동하게 된다. UIKit은 언제든지 `background` 상태나 `suspend` 상태의 연결을 끊고 리소스를 회수하여 해당 scene을 `unattached` 상태로 돌릴 수 있다.
다른 event에 대한 반응
라이프 사이클 이벤트를 다루는 것 이외에도 앱은 아래에 있는 상태를 다루기 위해 준비해야 한다. 대부분의 이벤트를 다루기 위해 UIApplicationDelegate를 사용하며, 어떤 경우에서는 알림을 사용해 다른 부분에서 응답을 할 수 있도록 한다.
- MemoryWarning
- 앱의 메모리 사용량이 매우 높을 때 수신되며, 앱이 사용하는 메모리 양을 줄인다.
- Protected data becomes available/unavailable
- 사용자가 기기를 잠그거나 해제할 때 수신됨 applicationProtectedDataDidBecomeAvailable(_:), applicationProtectedDataWillBecomeUnavailable(_:)
- Handoff tasks
- `NSUserActivity` 객체를 처리해야 할 때 수신됨
- Time Changes application(_:didUpdate:)
- 시간을 업데이트하는 것과 같이 다른 시간대의 변화를 받는 경우에 사용됨
- Open URLs
- 앱이 리소스를 열어야 할 때 수신됨 application(_:open:options:)
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
Managing your app’s life cycle | Apple Developer Documentation
Respond to system notifications when your app is in the foreground or background, and handle other significant system-related events.
developer.apple.com
[iOS/Swift] 앱의 생명주기 (App’s life cycle)
앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정함. 예를 들어, 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 비롯한 시스템 리소스보다 우선순위를
velog.io
https://velog.io/@rnfxl92/%EC%95%B1-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-Application-Life-Cycle
앱 생명주기 (Application Life Cycle)
App의 생명 주기는 App의 실행/종료 및 App이 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정을 뜻합니다.App의 현재 상태에 따라 할 수 있는
velog.io
https://developer.apple.com/videos/play/wwdc2019/258/
Architecting Your App for Multiple Windows - WWDC19 - Videos - Apple Developer
Dive into the details about what it means to support multitasking in iOS 13. Understand how previous best practices fit together with new...
developer.apple.com
'iOS > App' 카테고리의 다른 글
XCTestCase (2) | 2024.09.17 |
---|---|
[iOS] Privacy Manifest (2) | 2024.03.25 |
[SwiftUI] Widget Padding 없애기 (0) | 2024.01.07 |
[iOS] Share 기능 구현하기 +) 메타데이터? (1) | 2023.12.24 |
[iOS] UI Test와 Unit Test (0) | 2023.12.13 |