SceneDelegate / UIWindowScene / UISceneSession

J.Noma·2022년 2월 19일
1

iOS : View : UIKit

목록 보기
17/17

Reference


🌀 Scene 관련 객체들

🔘 화면 계층

  • UIWindowScene
    • 일반적으로 우리가 화면을 띄우면 UIScene이 아닌 UIWindowScene이 만들어집니다.
    • UIScene을 상속받습니다
  • UISceneSession
    • 해당 scene에 대한 정보를 갖고 있습니다
    • 각 UIScene은 하나의 UISceneSession을 갖습니다

🔘 SceneDelegate

  • SceneDelegate
    • Xcode가 기본적으로 생성해주는 class입니다
    • Scene Life Cycle과 환경 변화(size, orientation, trait)에 대한 노티를 수신
      (UIWindowSceneDelegate를 채택해서)

🌀 UIWindowScene

🔸 역할

windowScene 객체는 UIScene의 subclass로, device에 window를 display하고, 자신의 delegate에게 scene life cycle 노티를 날립니다

여기서 windowScene의 delegate란 UIWindowSceneDelegate를 채택하는 객체를 말하며, 대표적인 예로 Xcode가 기본적으로 제공하는 SceneDelegate가 있습니다

🔸 객체 생성

windowScene과 windowSceneDelegate 객체를 직접 만들면 안되고 아래 2가지 선택지를 통해 어떻게 생성될지에 대한 configuration을 제공할 수 있습니다

  1. Info.plist의 scene configuration에 class name 등을 포함시켜 명시할 수 있습니다
  2. application(_:configurationForConnecting:options:)라는 AppDelegate 메서드에서 UISceneConfiguration 객체를 만들 때 class name을 명시하는 방식도 가능합니다

시스템은 scene을 유발하는 유저 상호작용이 발생하면, 우리가 제공한 scene configuration에 기반하여 scene/sceneDelegate 객체를 생성합니다

또는 requestSceneSessionActivation(_:userActivity:options:errorHandler:)를 호출하여 UIKit에게 scene 생성을 요청하는 방식도 있습니다.

🔸 주요 프로퍼티/메서드

🔘 window 관련

  • windows : 해당 scene의 window
  • screen : scene의 content가 표시되고 있는 UIScreen 객체

🔘 환경 변화 콜백

  • traitCollection : App 환경을 말하며, sizeClass, layoutDirection, preferredContentSize 등이 포함된다

🔘 Status Bar 관련

  • statusBarManager : status bar를 숨기거나 style, frame 등을 변경할 수 있다

🌀 UISceneSession

🔸 역할

하나의 Scene 객체는 단 하나의 Session을 반드시 가진다. session은 연결된 scene에 대한 상세정보를 가진다

session의 life time은 UIKit에 의해 scene과 동일하게 유지된다. 즉, 함께 생성되며, scene이 닫기면 session도 따라서 제거된다. 이를 위해 id 프로퍼티도 가진다

🔸 객체 생성

session 객체를 직접적으로 생성하면 안됩니다. UIKit이 유저와의 상호작용에 따라 대신 만들게 되어 있습니다

만약 코드적으로 객체 생성을 제어하려면 requestSceneSessionActivation(_:userActivity:options:errorHandler:)를 호출하는 방법이 있습니다. 이 메서드는 UIKit이 새로운 scene과 session을 생성하도록 요청합니다. 이 때는 Info.plist에 기반한 default configuration으로 session을 초기화합니다

🔸 주요 프로퍼티/메서드

  • configuration : scene 생성에 대한 configuration
  • persistentIdentifier : session의 life time 관리를 위한 ID
  • stateRestorationActivity : scene 상태복구를 위한 UserActivity 객체
  • userInfo : scene과 관련한 커스텀 속성

🌀 UIWindowSceneDelegate (= SceneDelegate)

🔸 역할

  • Scene Life Cycle에 따라 노티를 받음
  • Scene 환경이 바뀔 때(ex. scene resize) 노티를 받음

🔸 직접 생성하지 않고 configuration을 설정한다

windowScene과 windowSceneDelegate 객체를 직접 만들면 안되고 아래 2가지 선택지를 통해 어떻게 생성될지에 대한 configuration을 제공할 수 있습니다

  1. Info.plist의 scene configuration에 class name 등을 포함시켜 명시할 수 있습니다
  2. application(_:configurationForConnecting:options:)라는 AppDelegate 메서드에서 UISceneConfiguration 객체를 만들 때 class name을 명시하는 방식도 가능합니다

시스템은 scene을 유발하는 유저 상호작용이 발생하면, 우리가 제공한 scene configuration에 기반하여 scene/sceneDelegate 객체를 생성합니다

🔸 주요 프로퍼티/메서드

🔘 환경 변화 콜백

  • windowScene(_:,didUpdate:,interfaceOrientation:,traitCollection:) : scene의 size, orientation, trait 변화에 대한 콜백

🔘 Scene Life Cycle
부모 프로토콜인 UISceneDelegate에 정의된 메서드들입니다

  • scene(_:willConnectTo:) : App에 추가됨
  • sceneDidDisconnect() : App에서 제거됨
  • sceneWillEnterForeground() : Foreground 진입 직전
  • sceneDidBecomeActive() : active 상태가 되어 유저 이벤트에 대응할 수 있음
  • sceneWillResignActive() : active가 해제되기 직전
  • sceneDidEnterBackground() : background에 진입됨
profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

안녕하세요 너무 좋은 글 감사합니다.
혹시 스터디 노션에 정리하고 공유를 해도 될까요 ? 출처는 해당 링크로 밝히겠습니다.

답글 달기