В iOS 13 появился новый способ отправки событий жизненного цикла приложения . Вместо того, чтобы проходить через UIApplicationDelegate
, они проходят через UIWindowSceneDelegate
, который является субпротоколом UISceneDelegate
. Методы UISceneDelegate
перечислены в документации API .
Это все для поддержки нескольких окон в iOS 13. В сеансе WWDC 2019 есть дополнительная информация 212 « Представляем несколько окон на iPad ». Техническая информация начинается около 14:30 и представляется человеком с очень блестящими высокими вершинами.
Если у вас есть " Манифест сцены приложения " в вашем Info.plist, и у вашего делегата приложения есть метод configurationForConnectingSceneSession
, UIApplication
не будет отправлять фоновые и приоритетные сообщения жизненного цикла делегату приложения. (applicationDidBecomeActive
, applicationWillResignActive
, applicationDidEnterBackground
, applicationWillEnterForeground
). Делегат приложения все равно получит willFinishLaunchingWithOptions:
и didFinishLaunchingWithOptions:
.
Если вы хотите вернуть старое поведение , вам нужно
- Удалить запись «Манифест сцены приложения» из Info.plist приложения
- Прокомментируйте или удалите метод
application:configurationForConnectingSceneSession:options:
(или функцию Swift application(_:configurationForConnecting:options:)
)
- Добавить свойство окна обратно вашему делегату приложения (
@property (strong, nonatomic) UIWindow *window;
)
Либо откройте файл SceneDelegate, созданный Xcode, и используйте там новые методы жизненного цикла:
- (void)sceneDidBecomeActive:(UIScene *)scene {
}
- (void)sceneWillResignActive:(UIScene *)scene {
}
... etc
Можно использовать новый материал жизненного цикла UIScene
без поддержки нескольких окон, установив для параметра «Включить несколько окон» («UIApplicationSupportsMultipleScenes») значение «НЕТ» в Info.plist (это значение по умолчанию для новых проектов). Таким образом, вы можете начать применять новый API меньшими шагами.
Вы можете видеть, что имена методов делегата сцены близко совпадают с именами делегатов приложения. Одна непонятная вещь заключается в том, что методы делегата приложения не являются устаревшими, поэтому вы не получите предупреждение, если у вас есть методы делегата приложения и сцены, но будет вызван только один.
Другие вещи, которые UISceneDelegate
берет на себя, это действия пользователя (continueUserActivity:
и т. Д.), Восстановление состояния (stateRestorationActivityForScene:
и т. Д.), Вопросы в строке состояния и вводные URL-адреса. (Я не уверен, заменяют ли они методы делегата приложения). Он также имеет аналогичные уведомления для событий жизненного цикла.
С сессии WWDC, некоторые изображения для вас:
Эквиваленты функций для Swift:
Класс обязанностей: