배경 지식
SceneDelegate의 등장
- iOS13부터 기존 AppDelegate에서 하던 책임을 SceneDelegate와 AppDelegate에서 나눠 가지게 되었다
- multi window의 등장으로 인해 등장한 개념으로 iPad-OS와 함께 등장하였다
UIScene
API를 통해 우리는 App UI의 여러 인스턴스를 만들 수 있다
UIScene과 UISceneDelegate
- 우리는 이제 여러 인스턴스 UI를 동시에 실행시킬 수 있다
- AppDelegate는 더 이상 UI 설정과 foreground, background와 같은 UI 라이프사이클 이벤트를 책임질 필요가 없다
- App UI 인스턴스는
UIScene
객체로 표현된다 UIApplication
이 AppDelegate를 통해 notify 하는 것처럼, scene도 SceneDelegate를 통해 똑같이 동작한다- 그래서 우리는 앞으로
UIWindowScene
과UIWindowSceneDelegate
을 사용하여 작업을 수행하면 된다
UIWindowScene이 뭔데?
UIWindowScene
이란UIScene
의 subclass이다- 개발자인 우리가 직접
UIWindowScene
을 생성할 필요 없다UIApplication의
requestSceneSessionActivation()
메서드를 호출하면 UIKit이 Info.plist에 있는 정보를 바탕으로 생성해 줄 것이다
UIWindowSceneDelegate는 뭔데?
UIWindowSceneDelegate
는 UISceneDelegate
프로토콜의 extends로 UIWindowScene
의 라이프 사이클 이벤트를 관리하는 핵심 메서드를 갖고 있다
UISceneSession은 뭔데?
- scene객체를 생성하기 위한 configuration data를 갖고 있는 객체이다
- UIApplicationDelegate 가 scene sessions의 라이프 사이클을 관리한다
- 모든 scene(window)는 UISceneSession에 의해 관리된다
UISceneConfiguration은 뭔데?
- UIKit이 어떻게 scene을 생성할지에 대한 정보를 가지고 있는 객체이다
- 또한 state restoration data를 갖고 scene이 disconnected 되고 나서 다시 유저가 앱을 다시 열었을때 기존 상태를 복구시킬 수 있는 객체이다
- Info.plist에서 UISceneCongifuration을 설정할 수 있다
SceneDelegate의 등장으로 변화된 AppDelegate의 책임
- iOS13 이후에도 여전이 앱의 entry point이며 아래의 AppDelegate 메서드를 통해 앱의 라이프 사이클 이벤트를 관리한다
func application(_:didFinishLaunchingWithOptions:) -> Bool
- 애플리케이션 설정을 수행하고 나서 호출된다
- iOS13 이전에는 위 메서드를 사용하여 UIWindow 객체를 생성하고 UIViewController 인스턴스를 UIWindow에 부여하여 widow가 유저에게 보이게 하였다 ( 더 이상 사용 X )
func application(_:configurationForConnecting:options:) -> UISceneConfiguration
- 애플리케이션이 새로운 scene을 제공해야 하거나 새로운 window를 나타내야 할 때 호출된다
- 앱이 실행될때마다 호출되는 것이 아닌 새로운 scene을 만들 때만 호출된다
func application(_:didDiscardSceneSessions:)
- 유저가 scene을 제거하게 되면 호출된다
- 해당 scene에서 더 이상 사용하지 않는 리소스를 해제할때 주로 사용된다
SceneDelegate의 책임
func scene(\_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
- 파라미터로 제공되는 scene (UIWindowScene)을 재설정하여 window(UIWindow)에 제공할 때 사용한다
- 스토리보드 기반으로 뷰를 구성할때는 별다른 설정이 필요 없지만 코드베이스로 구성할 때는 여기서 설정해줘야 한다
func sceneDidDisconnect(\_ scene: UIScene)
- 해당 scene이 시스템으로부터 연결이 끊어질때 호출된다
func sceneDidBecomeActive(\_ scene: UIScene)
- 해당 scene이 inactive상태에서 active상태로 변할 때 호출된다
func sceneWillResignActive(\_ scene: UIScene)
- 해당 scene이 active상태에서 inactive상태로 변할때 호출된다
- 전화가 오는 상황과 같이 일시적인 인터럽트 상태일때 호출된다
func sceneWillEnterForeground(\_ scene: UIScene)
- 해당 scene이 background상태에서 foreground상태로 변할 때 호출된다
func application(_:didDiscardSceneSessions:)
해당 scene이 foreground상태에서 background상태로 변할때 호출된다
SceneLifecycle 확인해보기
https://developer.apple.com/videos/play/wwdc2019/258/