Apple은 WWDC19를 통해 iOS13이후부터 Multiple Window를 제공하게 되었다.

<WWDC19>

Multiple Window를 위해 Scene이라는 개념이 추가가 되면서, 기존의 AppDelegate도 변하게 되고,

SceneDelegate가 새롭게 등장하게 되었다.

앞으로 여러 포스팅에 걸쳐서 Application의 Life Cycle을 알아보고자 한다.

우선, 이번 포스팅에서는 UIWindow와 UIScene의 개념을 간략히 알아보고,

어떤 방식으로 Multiple Window를 제공하는지 알아보고자 한다. 

 

 

 

 

UIWindow 

UIWindow란, View들을 담고 있는 컨테이너이다.

 특별한 경우를 제외하고선, 하나의 Window만 생성하고,

View가 바뀔 시에는 Window가 바뀌는 것이 아닌! 

Window의 rootViewController의 교체를 통해 View들을 교체한다.

 

iOS13이전, UIWindow는 view의 계층 구조에서 최상위를 담당하였다.

<WWDC19>

 

 

 

 

UIScene (UIWindowScene)

하지만, iOS13 이후로는 Scene개념이 등장하면서, UIWindow위에 UIWindowScene이 추가가 되었다.

<WWDC19>

Scene은 각 App의 UI 관리 하기 위해, UIKit에 의해 생성되며

App의 인스턴스를 가지고 있다.

이러한 인스턴스는 App의 UI를 위해 UIWindow를 포함하고 있다. 

 

UIKit에서는 UIScence이 아닌! UIWindowScence을 생성하게 된다.

실제 공식 Docummentation을 보면, UIScene을 상속한다.

 

또한, Scene이 변할때 마다, UIWindowSceneDelegate를 통해 알리게 된다.

이 UIWindowSceneDelegate는 SceneDelegate를 상속한다.

 

각 Scene들은 같은 메모리, 프로세스 공간을 공유하기에,  

하나의 App에 여러개의 Scene & SceneDelegate객체동시에 활성화가 가능하다

 

즉!

  • UIWindowScenceUIWindow를 관리한다
  • Scence의 Life CycleUIWindowSceneDelegate를 통해 관리하며!
  • 하나의 App에 여러개의 Scence과 ScenceDelegate객체를 가질 수 있다.

 

 

 

UISceneSession

UISceneSession의 역할을 보기 앞서, 어떻게 여러개의 Scene을 가질 수 있는지 알아보자!

 

<WWDC19>

iOS13이전에는 AppDelegate에서 UI LifeCycleProcess LifeCycle을 가지고 있어서,

UI들이 Process공간을 공유하기에 구조적으로 어려웠다.

즉, 앱은 오직 하나의 Process와 하나의 UI만 가졌다

<WWDC19>

iOS13 이후 부터는 ScenceDelegate가 등장하게 되면서,

AppDelegateProcess LifeCycle관리만 하게 되고,

ScenceDelegateUI LifeCycle을 담당하게 된다. 

 

Scene들과 AppDelegate와의 연결이 필요한데 이런 역할을 SceneSession이 담당하게 된다.

<WWDC19>

UI LifeCycle과 Process LifeCycle의 분리로 인해

여러 Scene들Process와 memory공간을 공유할 수 있게 되고,

이는 multiple windows를 가능하게 해준다.

 

 

UISceneSession은, 기본적으로 하나의 Scene과 연결이 되는데, 

Scene이 생성이 되면 UISceneSession이 생성되어, track하고 관리한다

 

이는 Scene를 닫기 전까지,(app switcher에서 끄는경우) Scene은 사라지지 않는다!

 

References

Apple Developer Documentations

 

복사했습니다!