SceneDelegate는 iOS13 부터 등장한 개념.
따라서 기존 AppDelegate와 함께 해야할 운명.
SceneDelegate란?
- iOS 13 부터 도입
- 앱당 하나의 window만을 가졌던 과거에 비해 앱당 여러개의 scene을 가질 수 있게되며 생겨남
- Scene에는 UI의 인스턴스를 나타내는 windows와 viewcontroller들이 들어있습니다.
- scene에 해당하는 UIWindowSceneDelegate를 가지고 있어 UIKit과 앱간 상호작용에 사용됨.
- Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 동시에 실행됨.
- 하나의 앱이 여러개의 scene과 scene delegate 객체를 동시에 활성화할 수 있게 도와줌
SceneDelegate로 인한 변화
SceneDelegate가 존재하기 이전 존재했던 App delegate는 크게 두 가지 역할을 하고 있었음.
(SceneDelegate 등장 이전)
해당 두 가지 역할은

- application에게 process level의 event 를 전달
- application에게 UI의 상태변화 전달
(SceneDelegate 등장 이후)
여러개의 scene의 등장

- 하나의 App에 하나의 window를 가질 수 있었지만, window개념이 scene으로 대체됨
- 이에따라 하나의 앱에서 여러개의 scene을 가질 수 있게됨
Scene이란
UIKit는 UIWindowScene 객체를 사용하는 앱 UI의 각 인스턴스를 관리합니다.
Scene에는 UI의 하나의 인스턴스를 나타내는 windows와 view controllers가 들어있습니다. 또한 각 scene에 해당하는 UIWindowSceneDelegate 객체를 가지고 있고, 이 객체는 UIKit와 앱 간의 상호 작용을 조정하는 데 사용합니다. Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 서로 동시에 실행됩니다. 결과적으로 하나의 앱은 여러 scene과 scene delegate 객체를 동시에 활성화할 수 있습니다.
Apple 공식문서 참조
UILifeCycle 역할

- 기존 AppDelegate의 역할인 UI 상태변화를 감지할 수 있는 메서드들이 SceneDelegate에 속하게 됨
Session LifeCycle 역할

- scene session이 생성 혹은 삭제될 때 두 메서드가 추가됨
- AppDelegate에서 Session LifeCycle을 관리하며 이를 통해 App에서 생성한 모든 scene의 정보를 관리함
Scene Session이란
UISceneSession 객체는 scene의 고유의 런타임 인스턴스를 관리합니다. 사용자가 앱에 새로운 scene을 추가하거나 프로그래밍적으로 scene을 요청하면, 시스탬은 그 scene을 추적하는 session 객체를 생성합니다. 그 session에는 고유한 식별자와 scene의 구성 세부사항(configuration details)가 들어있습니다. UIKit는 session 정보를 그 scene 자체의 생애(life time)동안 유지하고 app switcher에서 사용자가 그 scene을 클로징하는 것에 대응하여 그 session을 파괴합니다. session 객체는 직접 생성하지않고 UIKit가 앱의 사용자 인터페이스에 대응하여 생성합니다. 또한 위 3번에서 소개한 두 메소드를 통해서 UIKit에 새로운 scene과 session을 프로그래밍적 방식으로 생성할 수 있습니다.
Apple 공식 문서 참조
iOS 13 이후로 AppDelegate가 하는 것
- 앱의 가장 중요한 데이터 구조를 초기화하는 것
- 앱의 scene을 환경설정(Configuration)하는 것
- 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료)에 대응하는 것
- 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것
- 애플 push notification 서비스와 같은 실행시 요구되는 모든 서비스를 등록하는 것