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
'ios 면접 질문' 카테고리의 다른 글
swift initialization (0) | 2022.07.19 |
---|---|
Copy on write (0) | 2022.07.12 |
UIView 알아보기 (0) | 2022.07.10 |
Struct 와 Class, Enum 의 차이점 (0) | 2022.07.03 |
실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오. (0) | 2022.07.03 |
Comment