Что такое SceneDelegate в iOS?

«Что такое SceneDelegate в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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+.