본문 바로가기

IOS Swift

SceneDelegate 란?

SceneDelegate란?

iOS13 이후 UI 생명주기에 관한 이벤트를 처리하기 위해 사용하는 객체입니다.

앱을 실행하면 UIKit이 일반적으로 UIScene의 서브클래스인  UIWindowScene 객체를 생성합니다.

UIWindowScene는 UI의 State를 가지고 있습니다.

UI State에 따른 이벤트를 처리하기 위해  UIWindowSceneDelegate 프로토콜을 만들었고 구체적인 내용을 class인 SceneDelegate에다가 프로토콜을 채택하여 정의할 수 있습니다.

즉,  SceneDelegate란 UI 상태에 따른 이벤트처리를 하기 위한 객체입니다.

 

iOS 13 에서의 변화

iOS 13 이전

iOS 13 이후

 

SceneDelegate의 역할

  iOS13 이전 iOS13 이후
AppDelegate Process LifeCycle 관리
UI LifeCycle 관리
Process LifeCycle 관리
UISession LifeCycle 관리
SceneDelegate X UI LifeCycle 관리

 

iOS13 에서는 SceneDelegate가 새로 생겼습니다. iOS12까지는 AppDelegate에서 처리했던  UI LifeCycle을 SceneDelegate로 옮겨왔습니다.

이제 화면이 백그라운드로 가거나 포그라운드로 돌아올 때 등 화면 상태에 관한 이벤트 처리를 SceneDelegate가 하게 됩니다.

 

왜 SceneDelegate가 생겼을까? 

아이패드 같이 큰 화면의 하나의 앱에서 2개 이상의 화면을 보여주기 위해서 Scene 개념을 도입했습니다.

Scene이란?

UIKit는 UIWindowScene 객체를 사용하는 앱 UI의 각 인스턴스를 관리합니다. Scene에는 UI의 하나의 인스턴스(화면하나)를 나타내는 windows와 view controllers가 들어있습니다. 또한 각 scene에 해당하는UIWindowSceneDelegate 객체를 가지고 있고, 이 객체는 UIKit와 앱 간의 상호 작용을 조정하는 데 사용합니다. Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 서로 동시에 실행됩니다. 결과적으로 하나의 앱은 여러 scene과 scene delegate 객체를 동시에 활성화할 수 있습니다.

위 그림을 보시면, Scene(UIWindowScene)은 여러개의 UIWindow를 관리합니다. iOS13 부터는 하나의 앱에서 UIWindow를 여러개 생성할 수 있게 된 것이죠.  🥳

그런데 여기서 UIScene과 UIWindowScene의 차이점에 대해 궁금하신 분들이 있으실 것 같습니다. UIWindowScene은 UIScene의 서브클래스입니다.

공식문서에 따르면

Typically, UIKit creates a UIWindowScene object instead of a UIScene object, but you use the methods and properties of this class to access information about a scene.

일반적으로 UIWindowScene이 생성되지만 UIScene의 메소드들과 프로퍼티들이 사용된다고 하네요. UIScene을 왜 UIWindowScene로 서브클래싱한지는 나와있지 않아서 추측만 하고 있는데 혹시 이유를 아시는 분 계신가요?? 댓글 부탁드릴게요!  

그리고 마찬가지로 UISceneDelegate도 UIWindowSceneDelegate와 상속 관계입니다.

 

SceneDelegate의 메소드들

scene에서 발생하는 life-cycle event에 반응하기 위해 사용하는 메소드들 입니다.

func scene(**_** scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Scene함수는 UI창을 선택적으로 구성하고 제공된 UI창에 scene을 연결해준다. (iOS 13~)만약 스토리보드를 사용하는 경우에는 자동으로 window 프로퍼티가 초기화되고 화면에 첨부되게 된다.SceneDelegate는 연결된 scene 또는 session이 새로 생성된 것이라는 것을 의미하지는 않는다.
}
func sceneDidDisconnect(_ scene: UIScene) { 
// 시스템에 의해서 scene이 해제되면 호출이된다. Scene이 background에 들어간 직후나 session이 삭제되었을 때 호출된다. 다음 번에 해당 scene에 연결되는 경우에 새로 생성되는 자료들과 관련된 모든 자료들을 해제해준다.Session이 반드시 삭제되는 것은 아니므로 scene은 나중에 다시 연결될 수도 있다.
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Scene이 활성화 되었고 현재 사용자 이벤트에 응답하고 있음을 알린다.인터페이스를 로드 한 후 인터페이스가 화면에 표시되기 전에 호출된다
}
func sceneWillResignActive(_ scene: UIScene) {
// Scene이 활성상태를 해제하고 사용자 이벤트에 대한 응답을 중지하려고 함을 알린다.시스템 경고를 표시 할 때와 같은 일시적인 중단을 위해 이 메서드를 호출한다이 메서드가 반환 될 때까지 앱은 백그라운드 또는 포그라운드로 다시 전환되기를 기다리는 동안 최소한의 작업을 수행해야 한다.
}
func sceneWillEnterForeground(_ scene: UIScene) {
// scene이 foreground에서 실행되고, 사용자에게 표시 될 것임을 delegate에게 알립니다.이 전환은 새로 생성되고 연결된 scene뿐만아니라 background에서 실행 중이고, 시스템 또는 사용자 작업에 의해 background로 가져온 scene 모두에 대해 발생합니다.scene이 화면에 표시되기 위해 foreground에 들어가므로 이 메서드는 항상 sceneDidBecomeActive (_ :) 메서드를 호출합니다.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Scene이 background에서 실행되고 더 이상 화면에 표시되지 않음을 Delegate에게 알립니다.이 방법을 사용하여, scene의 메모리 사용량을 줄이고, 공유 리소스를 확보하며, scene의 사용자 인터페이스를 정리합니다.이 메서드가 반환 된 직후 UIKit은 앱 전환기에 표시하기 위해 Scene의 인터페이스의 스냅 샷을 찍습니다.
}

 

그럼 실제로 SceneDelegate를 더 잘 이해하기 위해

Multi Window 기능을 제공하는 앱을 실제로 만들어 봅시다! -> https://hongz-developer.tistory.com/138

 

참고 : 

https://developer.apple.com/videos/play/wwdc2019/258/?time=640

https://developer.apple.com/documentation/uikit/uiscene

반응형