Что такое UIScene? Для чего их используют?ios-90

Что такое UIScene?

UIScene — это фундаментальный объект в UIKit, представляющий отдельный экземпляр пользовательского интерфейса приложения. Введен в iOS 13 как часть новой архитектуры многозадачности.

Ключевые характеристики:

  • Представляет отдельную "сцену" приложения (например, окно на iPad)
  • Управляет жизненным циклом отдельного UI-контекста
  • Позволяет приложению иметь несколько независимых экземпляров интерфейса

Основные компоненты сцены

  1. UIWindowScene - конкретная реализация сцены, управляющая окнами
  2. UISceneSession - объект, управляющий жизненным циклом сцены
  3. UISceneDelegate - протокол для обработки событий жизненного цикла

Для чего используют UIScene?

1. Поддержка многозадачности на iPad

  • Разделенный экран (Split View)
  • Слайд-овер (Slide Over)
  • Множественные окна приложения

2. Изолированные контексты выполнения

  • Каждая сцена имеет собственный:
    • UI-стек (окна, view-контроллеры)
    • Состояние интерфейса
    • Пользовательские данные

3. Гибкое управление жизненным циклом

  • Разные сцены могут быть в разных состояниях (активна/фон/приостановлена)

Базовая реализация UIScene

1. Настройка в Info.plist

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
            </dict>
        </array>
    </dict>
</dict>

2. Реализация SceneDelegate

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    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 = MainViewController()
        window?.makeKeyAndVisible()
    }
}

Жизненный цикл UIScene

  1. willConnectTo - сцена создается
  2. sceneWillEnterForeground - сцена становится активной
  3. sceneDidBecomeActive - сцена получает фокус
  4. sceneWillResignActive - сцена теряет фокус
  5. sceneDidEnterBackground - сцена уходит в фон
  6. sceneDidDisconnect - сцена уничтожается

Современные возможности

1. Scene Phase API

// Отслеживание состояния сцены
@Environment(\.scenePhase) var scenePhase

switch scenePhase {
case .active: // Работает
case .inactive: // Не получает событий
case .background: // Не видна
}

2. Множественные сцены

// Создание новой сцены
let activity = NSUserActivity(activityType: "com.example.detail")
UIApplication.shared.requestSceneSessionActivation(nil,
                                                 userActivity: activity,
                                                 options: nil)

3. Сохранение состояния

func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? {
    return userActivity // Возвращаем текущее состояние
}

Практические советы

  1. Для простых приложений можно использовать одну сцену
  2. Всегда проверяйте тип сцены: guard let windowScene = scene as? UIWindowScene
  3. Используйте userActivity для передачи контекста между сценами
  4. Тестируйте поведение приложения с несколькими активными сценами

Резюмируем:

UIScene представляет современный подход к управлению интерфейсами в iOS, особенно важный для поддержки многозадачности на iPad и изолированных контекстов выполнения. Архитектура на основе сцен позволяет создавать более гибкие и мощные приложения.