[iOS] SceneDelegate에 대해서
UISceneDelegate | Apple Developer Documentation
The core methods you use to respond to life-cycle events occurring within a scene.
developer.apple.com
🙋♂️ iOS 13 이후
iOS 13 이후부터는 기존에 사용하던 Window의 개념이 Scene으로 대체되었으며, Appdelegate의 역할이었던 UILifecycle을 SceneDelegate가 맡게 되었다.
🙋♂️ Scene이란?
window의 개념이 Scene으로 대체되었다고 하는데 그렇다면 Scene은 무엇일까?
- UIKit은 UIWindowScene 객체를 사용하는 앱의 UI의 각 인스턴스를 관리한다.
- Scene에는 UI의 하나의 인스턴스를 나타내는 window와 viewController를 가집니다.
- 여러 Scene들은 동시적으로 실행되고 하나의 앱에서 동일한 메모리와 프로세스를 공간을 공유한다.
🙋♂️ Scene Session이란?
UILifecycle을 관리하는 역할이 SceneDelegate이 맡게 되었고, 대신 AppDelegate에서는 Scene Session을 통해서 Scene에 대한 정보를 관리하게 된다.
- UISceneSession 객체는 scene의 고유의 런타임 인스턴스를 관리합니다.
- 사용자가 앱에 새로운 scene을 추가하거나 프로그래밍적으로 scene을 요청하면, 시스템은 그 scened을 추적하는 session을 생성합니다. session에는 고유한 식별자와 scene의 configuration details이 들어있습니다.
- UIkit은 seesion 정보를 scene life cycle동안 유지하고 app switcher에서 사용자가 그 scene을 닫는 것에 응답하여 session을 파괴합니다.
- seesion은 직접적으로 생성할 수 없고 UIKit이 앱과 상호작용에 응답하여 session을 생성한다.
🙋♂️ SceneDelegate
- SceneDelegate에서는 앱이 포그라운드/백그라운드로 진입할 때와 앱이 활성화 될 때를 포함하는 Scene의 상태 변화에 응답하는 메서드가 정의된 인터페이스이다. 이러한 전환이 있을 때 적절한 메서드를 활용하여 동작을 제어할 수 있다. ex) 앱이 백그라운드로 진입하기 전에 중요한 작업들을 처리할 수 있음.
- UISceneDelegate의 객체는 직접적으로 생성할 수 없다. 대신 Scene의 데이터 구성이 필요할 때 커스텀 delegate 클래스의 이름을 명시할 수 있다.
- Info.plist에서 이러한 것들을 명시할 수 있다.(또는 UISceneConfiguartion 객체에서 application(_:configurationForConnecting:options:) 메소드를 반환할 수 있습니다.)
🙋♂️ SceneDelegate의 주요 메서드
- 앱에 장면이 추가 될 때 대리자에게 알려줌
- UISceneSeesion에서 호출되는 첫번째 메서드이다.
- 메소드 호출 시 UIKit은 적절한 Scene을 생성하여 앱에 연결한다.
optional func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
)
- Scene이 포그라운드에서 실행되기 시작하고 사용자에게 보여질 것임을 대리자에게 알려준다.
optional func sceneWillEnterForeground(_ scene: UIScene)
- SceneWillEnterForeground 호출 후 실행되는 메서드이다.
- Scene이 활성화되어 사용자 이벤트에 응답받을 수 있는 상태이다.
optional func sceneDidBecomeActive(_ scene: UIScene)
- Scene이 active 상태를 포기하고 사용자 이벤트에 대한 응답을 중지하려는 것을 대리자에게 알려준다.
- UIKit은 시스템 경고를 표시할 때처럼 일시적인 중단을 위해 이 메서드를 호출한다. 또한 앱을 백그라운드 상태로 전환하기 전에 이 메서드를 호출한다.
optional func sceneWillResignActive(_ scene: UIScene)
- Scene이 백그라운드에서 실행 중이며 화면에 표시되지 않는다고 대리자에게 알려준다.
optional func sceneDidEnterBackground(_ scene: UIScene)
https://velog.io/@nnnyeong/iOS-AppDelegate-SceneDelegate
https://velog.io/@dev-lena/iOS-AppDelegate%EC%99%80-SceneDelegate