SceneDelegate, AppDelegate에서 항상 볼 수 있는 UiScene
, UIWindowScene
, UISceneSession
, UIScreen
이란 무엇인가??
iOS Developer Document - UIWindowScene
iOS Developer Document - UIScreen
eungding - UISession, UIWindowScene, UISceneSession
iOS 13 이후부터 멀티 윈도우가 가능해지면서, Scene이라는 개념이 들어오기 시작했다.
공식문서를 한 번 살펴보자
An object that represents one instance of your app's user interface
(앱 UI의 인스턴스를 나타내는 객체)
@MainActor class UIScene : UIResponder
UIKit은 유저 혹은 앱이 요청한 앱의 UI의 각 인스턴스에 대한 scene 객체를 생성한다. 보통은, UIKit은 UIScene
대신 UIWindowScene
객체를 생성하지만 UIScene
클래스의 메소드와 속성을 사용하여 scene 정보에 엑세스 한다.
모든 scene 객체는 UISceneDelegate
프로토콜을 채택하는 객체인 delegate 프로퍼티가 있다. scene의 상태가 변경되면 scene개체가 delegate에게 알리고 등록된 observer에 적절한 Notification을 post합니다.
특정한 session과 connection 정보들로 Scene을 만든다
UISceneDelegate에서는 scene life cycle에 관련된 메소드들이 있는 것을 확인했다.
A scene that manages one or more windows for your app
(하나 이상의 windows를 관리하는 scene)
@MainActor class UIWindowScene: UIScene
UIWindowScene 객체는 해당 scene을 표시하는 하나 이상의 window를 포함하여 앱의 하나의 app UI 인스턴스를 관리한다. scene 객체는 사용자 장치의 window 표시와 사용자 상호작용하는 scene의 수명 주기를 관리합니다. scene의 상태가 변경되면 scene 개체는 UIWindowSceneDelegate 프로토콜을 채택하는 delegate 개체에 알립니다. 또한 register를 한 obser들에게 적절한 Notification을 post합니다. 변경 사항에 응답하려면 delegate 개체 또는 notification observer를 사용하세요
window scene 객체를 직접 생성하지 마세요. 대신, 앱의 Info.plist 파일의 Secene Configuration에서 클래스 이름을 포함하여 UIWindowScene 객체를 원하는 타입을 명시하세요. 그리고 또한 AppDelegate
의 application(_:configurationForConnecting:options:)
메소드에서 UISceneConfiguration
객체를 생성할 때 class 이름을 명시할 수 있습니다. 사용자가 앱과 상호작용할 때, 시스템은 당신이 제공한 configuration 데이터들을 기반으로 적절한 scene을 생성할 것입니다. programmatically하게 scene을 생성하기 위해서는, UIApplication
의 메소드 requestSceneSessionActivation(_:userActivity:options:errorHandler:)
를 호출하세요
위에 공식문서를 보고 WWDC 영상에 있던 위 이미지를 보니깐 조금 이해가 되는 것 같네요
UIWindowScene
은 UIWindow
들을 관리한다!!
아 그리고 또 하나, delegate에 대한 언급이 있었는데, UIWindowSceneDelegate
가 UISceneDelegate
를 상속하고 있다는 점! 그래서 SceneDelegate
가 UIWindowSceneDelegate
를 채택하고 있었기에 Scene의 Life cycle 관련 메소드들을 가지고 있었네요!
An object that contains information about one of your app's scenes.
(앱의 scene들 중 하나에 대한 정보를 포함하고 있는 객체)
@MainActor class UISceneSession : NSObject
UISceneSession 객체는 scene 인스턴스의 런타임을 관리한다. 유저가 새로운 scene을 앱에 추가한다면, 혹은 programmaticlly하게 당신이 요청했다면, session 개체를 생성하여 해당 scene을 추적합니다. session에는 고유한 식별자와 scene의 구성 세부 정보가 포합됩니다. UIKit은 scene 자체의 life-cycle 동안 session 정보를 유지하여 사용자가 앱 전환기에서 scene을 닫는 것에 대한 응답으로 session을 파괴합니다.
session은 직접적으로 생성할 수 없고, UIKit이 사용자의 상호작용에 따라 응답으로 session을 생성합니다. UIApplication의 메소드requestSceneSessionActivation(_:userActivity:options:errorHandler:)
를 호출함으로써 생성할 수 있다. UIKit은 Info.plist file의 default configuration data를 기반으로 session을 초기화한다.
scene이라는 프로퍼티가 UISceneSession에 있으며, 옵셔널 타입인 걸 보니 scene이 session으로부터 connect 할 수도?, disconnect할 수도 있겠네요.
마지막으로 알아볼 것은 Screen입니다! 공식문서 보죠!
An object that defines the properties associated with a hardware-based display.
(하드웨어 기반 디스플레이와 관련된 속성을 정의하는 개체이다.)
@MainActor class UIScreen : NSObject
iOS 기기에는 main screen이 있고, 0개 이상의 화면이 부착되어 있다. TVOS 장치에는 장치에 연결된 텔레비전을 위한 main screen이 있습니다. 이 클래스를 사용하여 장치에 연결된 각 디스플레이의 화면 개체를 가져올 수 있습니다. 각 screen 객체는 디스플레이와 관련된 bounds 직사각형과 밝기와 같은 흥미로운 속성들을 정의합니다. iOS 8 이후에는, screen bounds 속성은 화면의 orientation(방향)을 고려하기 시작했습니다. 이것은 세로 방향의 장치에 대한 bounds와 가로 방향의 장치에 대한 bounds가 동일하지 않을 수 있다는 것을 의미합니다. 화면 크기에 의존하는 앱은 fixedCoordinateSpace 프로퍼티를 통해 계산해야 하는 모든 계산을 위한 고정 기준으로 사용할 수 있습니다. 장치를 가로 또는 거꾸로 돌려도 bounds 값의 변경이 일어나지 않습니다.
음... UIScreen은 생각보다 별거는 없고 실제 앱이 실행된 Screen에 대한 정보에 대해 알 수 있는 객체인 것 같습니다. UITraitEnvironment 프로토콜을 채택하고 있는 것으로 보아 traitCollection
프로퍼티를 통해서 Size class, Dynamic Type 등등에 대해 접근할 수 있겠네요.