앱의 현재 상태는 현재 할 수 있는 것과 할 수 없는 것을 결정한다.
예를 들어, Foreground app은 사용자가 주목하고 있기 때문에 CPU와 같은 시스템 자원의 우선순위가 높다.
반대로 Background app의 경우, 앱이 화면에 나타나있지 않기 때문에 아무것도 하지 않거나 최대한 적은 일을 해야 한다.
기본적으로 3가지 실행 모드와 5가지의 상태, 항상 하나의 상태를 가진다.
- Not Running 앱이 실행되지 않는 모드와 상태 (완전 종료, 동작 X)
- Foreground 앱이 실행되는 모드
- Active 사용자 이벤트를 받아서 상호작용할 수 있는 상태
- Inactive 멀티태스킹 윈도우로 진입하거나 앱 실행 중 전화, 알림 등에 의해 앱을 사용할 수 없는 경우!
사용자로부터 이벤트를 받을 수 없는 상태
- Background 홈 화면으로 나가거나 다른 앱으로 전환되면 현재 앱이 실질적인 동작을 하지 않는 상태
- Running 재생한 음악이 계속 실행되는 경우, 서버와 데이터 동기화, 타이머 실행되는 등
백그라운에서도 앱이 실행되는 상태
- Suspend 앱이 백그라운드 모드로 변경되었을 때 다른 작업을 하지 않으면 suspended 상태로 진입
이 상태의 앱들은 iOS 메모리가 부족해지면 가장 먼저 메모리에서 해제
앱을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해 메모리 관련 데이터만 저장되어 있는 상태
앱 실행 과정
- Not Running → Active
앱 실행되는 과정
- Active → Inactive → running(Background)
앱 활성화에서 비활성화 상태로 변경시킨 뒤, Background에서도 실행 중인 상태 (Background에서 실행)
- Active → Inactive → suspend(Background)
앱 활성화에서 비활성화 상태로 변경시킨 뒤, Background에서 일시정지 중인 상태 (Background에서 실행 X)
- Running → Active
Background에서 실행 중인 앱이 다시 Foreground에서 활성화되는 상태
UIKit에서는 앱의 상태가 변경될 때, delegate 오브젝트 메소드를 호출한다.
- UISceneDelegate, scene-based app [iOS 13+]
- UIApplicationDelegate [iOS 12-]
scene은 디바이스에서 실행 중인 앱의 UI 한 인스턴스를 나타낸다. (한 화면!)
앱에 여러 scene을 만들 수 있고, 이들을 분리해서 숨기거나 나타낼 수 있다.
왜냐하면 scene은 각자 자신의 life cycle이 있고 각자 실행에 대한 다른 상태를 가지고 있다!
→ 한 scene은 foreground 모드고, 다른 scene은 background(running) 혹은 suspended 상태일 수 있다.
사용자 또는 시스템이 새로운 scene을 요청하면, UIKit은 scene을 생성하고 unattached 상태로 만든다.
- 사용자에 의한 scene이라면, 해당 scene은 화면에 나타나며 foreground
모드로!
- 시스템에 의한 scene이라면, 해당 scene은 보통 이벤트를 처리할 수 있도록 background
모드로! (running 상태)
예시) 시스템은 location event를 처리하기 위해 scene을 background에 런칭한다면
- 사용자가 app의 UI를 끄면 UIKit은 UI와 연관된 scene을 background 모드로 변경시키고, 결국 suspended 상태가 된다.
- UIKit은 시스템이 자원을 요청하면 background or suspended scene을 메모리 해제하고 이 scene을 unattached state로 변경
scene 전환
- UIKit이 앱에 scene을 연결할 때, scene의 초기 UI를 설정하고 scene이 필요로 하는 데이터 로드
- Foreground-active state로 전환될 때, UI를 설정하고 사용자와의 상호작용을 준비
- Foreground-active state에서 빠져나올 때(background로!), 데이터를 저장하고, 앱 행동을 종료한다.
- Background state로 들어갈 때, 중요한 task는 종료하고 메모리는 가능한 만큼 해제, 앱 스탭샷 준비
- scene이 끊기면, scene과 연관된 공유 자원 정리
app delegate는 앱의 모든 window를 관리한다. (분리된 화면 마저!)
→ 앱 상태 전환은 앱의 전체 UI에 영향을 받는다.
앱 런칭 후, 시스템은 앱을 UI가 화면에 나타났는지에 따라 inactive 혹은 background 상태로 둔다.
foreground에서 런칭되었을 때, 시스템은 앱을 자동으로 active 상태로 전환한다.
그 후, 상태는 앱이 종료될 때까지 active와 background 사이에서 변경된다.
app 전환
- Launch시, 앱의 데이터 구조와 UI를 초기화
- 활성화 시, UI 설정을 끝내고 사용자와 상호작용 준비
- 비활성화 시, 데이터를 저장하고 앱 행동 종료
- background 상태에 들어갈 시, 중요 task 종료, 메모리 가능한 많이 정리하고 앱 스냅샷 준비
- 종료 시, 즉시 모든 작업을 종료하고 공유 자원 풀기
life-cycle event를 처리하는 것 이외에도 다른 이벤트도 처리할 수 있어야 한다!
→ 이 이벤트들은 UIApplicationDelegate 사용!
- Memory warnings: 앱 메모리 사용이 너무 많을 때 앱이 사용하는 메모리의 양 줄이기!
- Protected data becomes available/unavailable: 디바이스를 사용자가 잠금 혹은 해제할 때
- Handoff tasks: 처리할 필요가 있는 NSUserActivity 오브젝트
Handoff? 다른 애플 기기의 작업을 끊김 없이 다른 기기에서 이어서 진행
- Time changes: 통신사가 시간 업데이트를 보낼 때처럼 여러 다른 시간 변경 시
- Open URLs: 리소스를 열어야 할 때
참고
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
'iOS' 카테고리의 다른 글
[iOS/UIKit] 화면 전환에 대해 알아보자! (0) | 2023.03.14 |
---|---|
[iOS] View Life Cycle을 알아보자! (0) | 2023.02.21 |
[iOS] AutoLayout 정복하기 - Constraints (0) | 2023.02.13 |
[iOS/SwiftUI] MVVM에 대해 알아보자! (0) | 2023.02.09 |
[SwiftUI] Layout (공부편) (0) | 2023.01.18 |