Scene Delegate의 역할에 대해 설명하시오
iOS 12 이하 버전의 AppDelegate
iOS 12 이하 버전에서는 Scene Delegate 라는 것이 존재하지 않고, 오로지 AppDelegate 만 존재했다. iOS 12 이하 버전에서의 AppDelegate는 다음과 같이 2가지 역할을 했었다.
- Process Level 의 이벤트 발생을 알려줌
- 애플리케이션 시작 life cycle
- 애플리케이션 종료 life cycle
- 기타 등등의 life cycle 발생 시 delegate 메소드 실행
- UI 의 상태변화를 알려줌
- 애플리케이션이 포그라운드 상태로 진입해 유저에게 보여지거나
- 백그라운드 상태로 진입해서 유저에게서 숨겨지거나
- 여러 가지 UI 이벤트가 존재할 때 delegate 메소드를 실행
위와 같이 AppDelegate 가 UI 와 프로세스의 라이프 사이클을 전부 관리할 수 있었던 이유는, iOS 12 이하 버전에서 애플리케이션은 오직 하나의 User Interface 만을 가졌기 때문이다.
iOS 12 이하 버전의 AppDelegate 는 따라서 다음과 같은 형식으로 작성되었다.
- 먼저 Database 연결과 같이 프로세스 전체 라이프 사이클에서 한 번만 실행되면 되는 global setup 을 하고,
- 두 번째로 application 의 UI 인스턴스를 생성하는 역할을 가졌다.
iOS 12 이후의 AppDelegate
iOS 12 이후로, iPad os 에서 하나의 애플리케이션에서 여러 개의 윈도우를 띄우는 멀티 윈도우 기능이 추가되었다. 따라서 기존의 AppDelegate 는 Process Lifecycle 을 관리하는 역할을 그대로 맡고 있지만, UI Lifecycle 을 관리하는 역할은 더 이상 맡지 않는다.
대신 Scene Delegate 가 UI 인스턴스를 생성하고 관리하는 역할을 맡게 되었다.
하나의 애플리케이션이 여러 윈도우를 생성할 수 있다. 하나의 윈도우를 Scene 이라고 불르는데, 이 Scene 의 Life cycle 을 관리하는 Scene Delegate 가 새로 생겼다.
요즘은 프로젝트를 생성하면 AppDelegate 와 SceneDelegate 라는 두 가지 파일이 다 같이 생기는 것을 볼 수 있다.
Multiple Scene 이 가능하게 되면서 AppDelegate 는 또 한 가지의 역할을 가지게 되었다.
App Delegate 는 새로운 Scene Session 이 생성되거나, 이미 존재하는 Scene Session 이 사라질 때마다 이벤트를 발생시킨다.
Scene Delegate
User Interface 의 상태변화가 있을 때마다 이벤트를 발생해 delegate method 를 실행한다. Scene Delegate 는 다음과 같은 method 들을 가지고 있다.
- scene(_: willConnectTo: options:) -> 새로운 Scene 을 가지고 UIWindow 인스턴스를 생성하는 부분
- sceneWillEnterForegroun(_ :)
- sceneDidBecomeActive(_ :)
- sceneWillresignActive(_ :)
- sceneDidEnterBackground(_ :)
- sceneDidDisconnect(_ :)
즉 application 은 multi window 를 가지고 있고, 하나의 window 가 background 모드로 바뀌거나, 다시 active 상태로 바뀔 때마다 각 윈도우의 Scene Delegate method 가 호출되는 것이다.
Application Life cycle
전체적인 Application 의 라이프 사이클 순서를 살펴보자.
처음 Application 을 실행하면 다음과 같은 Life cycle 을 따른다
- AppDelegate 의 didFinishLaunching delegate method 가 실행됨 -> 프로세스가 실행될 때 딱 한 번만 호출되고, 따라서 UI 와 무관한 일회성 설정작업들을 주로 이 method 에서 실행한다.
- System 이 Scene Session 을 생성
- AppDelegate -> UIScene configuration
- SceneDelegate 의 scene willConnectTo delegate method 가 실행됨. 이곳에서 UIWindow 인스턴스를 생성
User 가 홈 화면 진입 시
- SceneDelegate: willResignActive
- SceneDelegate: didEnterBackground
- SceneDelegate: didDisconnect -> system 은 한정된 자원을 갖고 있기 때문에 항상 불필요하게 소모되는 자원을 줄여야 한다. 따라서 Scene 이 background 모드를 진입한 후 어느 시점엔 Scene 을 memory 로 부터 해제시킨다. 하지만 scene 이 다시 reconnect 될 수 있는데, 이 때 사용자의 input 과 같이 다시 생성하기 어려운 데이터들은 삭제하면 안 된다.
User 가 app switcher 를 통해 Application 을 종료할 시
- AppDelegate: didDiscardSceneSessions -> 하나의 Scene Session 이 종료될 때 호출되는 delegate 메소드로, Scene 과 관련된 데이터를 이 곳에서 주로 지우게 된다.
예를 들어 텍스트를 편집하는 애플리케이션이 존재하고 multiple window 를 지원한다고 가정해보자. 이전에 Scene Delegate 의 didDisconnect 메소드에서 재생성하기 어려운 유저 input 과 같은 데이터는 삭제하면 안 된다고 가정했다. 왜냐하면 Scene 이 reconnect 될 경우 사용자는 기존에 작업하던 텍스트들이 그대로 유지되길 기대하기 때문이다.
따라서 App switcher 를 통해 유저가 명시적으로 애플리케이션을 종료하는 경우에만, 현재 Scene 에서 작업 중이던 데이터를 삭제하면 되는 것이다.
References
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] AppDelegate & SceneDelegate
AppDelegate / SceneDelegate과 관련된 면접 질문 SceneDelegate에 대해 설명하시오. 출처 상태 변화에 따라 다른 동작을 처리하기 위한 AppDelegate methods를 설명하시오. 출처 상태 변화에 따라 다른 동작은 iO..
sueaty.tistory.com