App-Based Life-Cycle State (iOS 12 and earlier)
[참고]
OS는 각각의 앱마다 모두 상태 변화를 제어하여 어떤 앱은 실행시키고, 어떤 앱은 백그라운드, 어떤 앱은 종료하는 등 다양한 처리를 한다.
Apple에서 정의하는 앱의 상태(App State)는 크게 5가지로 구분된다.
- Not Running: 앱이 시작되지 않았거나, 실행되었지만 시스템에 의해 종료된 상태
- Inactive: 앱이 전면(Foreground)에서 실행중이지만, 아무런 이벤트를 받지 않는 상태, 앱의 상태 변화 과정에서 잠깐 머무는 단계
- Active: 앱이 전면(Foreground)에서 실행중이며, 이벤트를 받고있는 상태
- Background: 앱이 백그라운드에 있지만, 여전히 코드가 실행되고 있는 상태
- 대부분의 앱은 Suspended 상태로 이행하는 도중에 일시적으로 이 상태에 진입하지만, 파일의 다운로드나 업로드, 연산처리 등 여분의 실행 시간이 필요한 앱일 경우 특정 시간이나 상황동안 이 상태로 남아있게 된다. (게임 백그라운드 다운로드 같은 경우)
- Suspended: 앱이 메모리에 유지되지만, 실행되는 코드가 없는 상태
- 메모리가 부족한 상황이라면, OS는 didReceiveMemoryWarning()나 같은 기능을 하는 연관된 메소드를 호출하여 앱의 전면(Foreground)에 있는 앱의 여유 메모리 공간을 확보하기 위해 Suspended 상태에 있는 앱들을 특별한 알림 없이 종료한다. (Suspended -> Not Running 상태로 진입하는 것은 알림을 받지않는다.)
앱의 실행 상태가 변화할 때마다 Application객체는 UIApplicationDelegate 프로토콜에 정의된 특정 메소드르 호출한다.
사용자는 이 메소드 내부에 Custom Code를 작성함으로써 사용자가 원하는 작업이 실행되도록 할 수 있다.
UIApplicationDelegate 프로토콜엔 다양한 메소드들이 있고, 각 메소드들은 그에 맞는 상태 변화에 따라 호출된다.
Scene-Based Life-Cycle Event (iOS 13 and later)
IOS 13에 들어서면서 앱이 Scene을 지원하고, UIKit은 각 Scene마다 별도의 LifeCycle Event를 제공한다. 또한 멀티 윈도우 기능이 생겼다..
IOS 13 이전까진 하나의 프로세스는 하나의 UI만 가졌지만 이후엔 여러 UI 인스턴스와 이를 가진 Scene을 추척하는 Scene session을 가질 수 있게되어 AppDelegate의 책임이 나눠졌다.
SceneSession은 생성한 모든 Scene의 정보를 관리, 추척한다.
scene의 고유한 식별자와 세부 구성 정보가 포함되어있다.
기존에 AppDelegate가 책임졌던 UI LifeCycle은 SceneDelegate가 책임 지게됐고, 해당 Scene session들의 생성과 삭제, 그리고 process LifeCycle은 AppDelegate가 책임진다.
Process Lifecycle의 역할은 앱이 실행되었는지, 혹은 종료되었는지를 확인하고 중요한 event들에 대응
[참고]
위 그림은 애플 문서에서 제공하는 Scene의 상태 전환을 보여주는 그림이다.
- 사용자나 시스템이 앱의 Scene을 요청하면 UIKit이 이를 생성하고 Unattached 상태로 보낸다. (대기 상태)
- 요청자가 사용자라면 Scene을 Foreground로 전환
- 요청자가 시스템이라면 Scene을 Background로 전환하여 이벤트 처리
- 사용자가 앱의 UI를 종료하면 (앱 종료가 아님) UIKit은 Scene을 Background로 전환하고 Suspended 상태로 전환
- UIKit은 리소스 회수를 위해 Background, Suspended 상태의 앱은 언제든지 연결을 끊고 Unattached 상태로 전환할 수 있다.
앱의 상태가 변하면 UIKit은 적절한 대리자 객체의 메서드를 호출하여 알려준다.
아니 근데
IOS 13에서 멀티 윈도우를 지원안하게 해놓으면 어떻게 되는건지 도통 모르겠더라
Scene과 관련된 Delegate 등은 멀티 윈도우 지원 이후로 생겨났기에, 멀티 윈도우 지원을 위해 사용되는 것으로 생각이 되는데, 지원 안할거면 안쓰고 그냥 AppDelegate로 다 하면 되는거 아닌가? 생각이 들었다.
iOS 13 이상에서는 UISceneDelegate 객체를 사용하여 scene-based app에 Life Cycle 이벤트에 응답합니다.
iOS 12 이하에서는 UIApplicationDelegate 개체를 사용하여 Life Cycle 이벤트에 응답합니다.
응 매칭되니깐 그냥 하란대로 SceneDelegate에 해 ㅋㅋ 라고 프레젠테이션에서 말하는 것 같았다..
근데 이미 만들어진 앱에서 멀티 윈도우 지원을 하고싶지 않다면 그냥 사용하지않아도 된다고 하는 것 같은데...
'iOS > Swift' 카테고리의 다른 글
Swift) Delegate (0) | 2022.02.13 |
---|---|
SOLID (0) | 2022.02.13 |
Swift) weak, unowned (0) | 2022.02.13 |
Swift) 순환 참조 , strong, weak (0) | 2022.02.13 |
Swift) ARC (0) | 2022.02.13 |
댓글