Ответ
SceneDelegate — это класс, представленный в iOS 13, который управляет жизненным циклом и интерфейсом одного окна (UIWindow) вашего приложения. Он является частью архитектуры, поддерживающей множественные сцены (окна) на iPadOS и в многозадачных режимах.
Зачем он нужен?
До iOS 13 AppDelegate отвечал и за жизненный цикл приложения, и за управление главным окном. С появлением возможности запускать несколько экземпляров (сцен) приложения одновременно (например, два окна одного приложения на iPad), ответственность разделили:
AppDelegate: Управляет жизненным циклом всего приложения (запуск, завершение, фоновые задачи).SceneDelegate: Управляет жизненным циклом и интерфейсом отдельной сцены (окна).
Основные методы SceneDelegate:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// 1. Создание сцены и окна
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = MainTabBarController() // Установка корневого VC
window?.makeKeyAndVisible()
}
// 2. Сцена становится активной (на переднем плане)
func sceneDidBecomeActive(_ scene: UIScene) {
// Возобновить анимации, обновить UI
}
// 3. Сцена переходит в фон
func sceneDidEnterBackground(_ scene: UIScene) {
// Сохранить данные, освободить ресурсы
}
}
Настройка в Info.plist:
Для работы SceneDelegate в Info.plist должен быть ключ Application Scene Manifest, который связывает класс делегата с сценой.
Обратная совместимость:
В приложениях, поддерживающих iOS 12 и ниже, вся логика по-прежнему должна оставаться в AppDelegate. SceneDelegate используется только для iOS 13+.