Методы делегата приложения не вызываются в iOS 13 - PullRequest
0 голосов
/ 08 июня 2019

Я использую Xcode 11 и создаю приложение для iOS 13. В новом проекте, который я создал в Xcode, я добавил методы делегата для UIApplicationDelegate. В новом шаблоне проекта «Single View App» их не было. Проблема в том, что ни один из методов делегата, кроме -application:didFinishLaunchingWithOptions:, не вызывается. Вот мой делегат приложения:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"application:didFinishLaunchingWithOptions:");
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"applicationDidEnterBackground:");
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"applicationWillEnterForeground:");
}
#pragma mark - UISceneSession lifecycle

- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}

- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
}

@end

1 Ответ

4 голосов
/ 08 июня 2019

В 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:.

Если вы хотите вернуть старое поведение , вам нужно

  1. Удалить запись «Манифест сцены приложения» из Info.plist приложения
  2. Прокомментируйте или удалите метод application:configurationForConnectingSceneSession:options: (или функцию Swift application(_:configurationForConnecting:options:))
  3. Добавить свойство окна обратно вашему делегату приложения (@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:

enter image description here

Класс обязанностей:

enter image description here

...