Ответ
Механизм обработки зависит от состояния приложения (foreground/background или terminated).
Когда приложение открыто (foreground):
- Уведомление доставляется напрямую в код приложения.
- Для UserNotifications framework (iOS 10+) вызывается метод делегата
UNUserNotificationCenterDelegate:func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // Решение: показать уведомление в интерфейсе или обработать тихо completionHandler([.banner, .sound, .badge]) } - Для устаревшего подхода может вызываться
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)вAppDelegate.
Когда приложение закрыто (terminated) или в фоне (background):
- Система отображает баннер, звук и значок (badge).
- При тапе пользователя на уведомление:
- Если приложение было закрыто, оно запускается, и в
application(_:didFinishLaunchingWithOptions:)доступны данные уведомления вlaunchOptions[.remoteNotification]. - Если приложение было в фоне, оно переходит в foreground, и вызывается
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)илиuserNotificationCenter(_:didReceive:withCompletionHandler:).
- Если приложение было закрыто, оно запускается, и в
Практическое отличие: В foreground вы должны явно решить, как отобразить уведомление (например, через completionHandler). В background/terminated системный баннер показывается автоматически, а ваше приложение получает данные для обработки после взаимодействия пользователя.