Рекомендации по управлению несколькими экранами в приложениях iOS: прекращение поддержки keyWindow в iOS 13.0

С выпуском iOS 13.0 компания Apple прекратила использование свойства keyWindow для приложений, поддерживающих несколько экранов. Это изменение было внесено, чтобы соответствовать внедрению поддержки нескольких окон в iPadOS и побудить разработчиков принять новый подход на основе UIWindowScene. В этой статье мы рассмотрим различные методы управления несколькими экранами в приложениях iOS и предоставим примеры кода, которые помогут вам обновить базу кода.

  1. Использование UIWindowScene:
    Начиная с iOS 13.0, UIWindowScene стал основным способом управления окнами в приложениях iOS. UIWindowScene представляет собой экземпляр сцены в вашем приложении, который может иметь собственную иерархию окон. Вот пример создания новой UIWindowScene:
guard let windowScene = UIApplication.shared.connectedScenes
    .filter({ $0.activationState == .foregroundActive })
    .first as? UIWindowScene else { return }

let window = UIWindow(windowScene: windowScene)
window.rootViewController = MyViewController()
window.makeKeyAndVisible()
  1. UIWindowLevel:
    UIWindowLevel определяет порядок расположения окон на экране. По умолчанию окна имеют уровень 0. Вы можете настроить уровень окна, чтобы контролировать его видимость выше или ниже других окон. Например, чтобы представить окно выше всех остальных:
window.windowLevel = UIWindow.Level.alert + 1
  1. Использование UIWindow в качестве контроллера корневого представления:
    В некоторых случаях вам может потребоваться назначить экземпляр UIWindow непосредственно в качестве контроллера корневого представления вашего приложения. Вот как этого можно добиться:
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = MyViewController()
window.makeKeyAndVisible()
  1. Обработка нескольких окон в UIWindowSceneDelegate:
    Если ваше приложение поддерживает несколько окон, вы можете управлять ими, реализовав методы UIWindowSceneDelegate. Например, чтобы создать новое окно при подключении сцены:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene else { return }

    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = MyViewController()
    window.makeKeyAndVisible()
}

В iOS 13.0 и более поздних версиях свойство keyWindow устарело для приложений, поддерживающих несколько экранов. Крайне важно обновить свой код, чтобы принять новый подход на основе UIWindowScene для эффективного управления несколькими экранами. Используя UIWindowScene, UIWindowLevel и соответствующие методы делегирования, вы можете создавать надежные и гибкие многоэкранные возможности в своих приложениях iOS.