Как тестировать пуш-уведомления и отлаживать их в разных состояниях приложения
Что проверяют
Понимаете ли вы, что одно и то же уведомление обрабатывается разным кодом в зависимости от состояния приложения, и знаете ли, где искать причину, когда пуш «не пришёл». Следом просят объяснить разницу между обычным и тихим пушем.
Как отвечать
Разложите по состояниям:
- foreground: по умолчанию система баннер не показывает. Решает
userNotificationCenter(_:willPresent:withCompletionHandler:)уUNUserNotificationCenterDelegate, возвращая.banner,.list,.sound,.badge; - фон и закрытое приложение: уведомление показывает система, ваш код срабатывает по тапу в
userNotificationCenter(_:didReceive:withCompletionHandler:). Делегат назначают до концаapplication(_:didFinishLaunchingWithOptions:), иначе тап при холодном старте теряется и диплинк не открывает экран; - тихий пуш:
content-available: 1, заголовокapns-push-type: background, приоритет 5. Будит приложение черезapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:), но система такие пуши дросселирует, а после смахивания приложения из переключателя не доставляет вовсе; - Notification Service Extension: при
mutable-content: 1расширение подгружает картинку или расшифровывает текст. Отлаживается отдельно, через схему расширения или Attach to Process.
Инструменты. В симуляторе пуш отправляется без сервера: перетащить файл .apns или выполнить xcrun simctl push booted <bundle-id> payload.json. Для устройства есть Push Notifications Console от Apple: отправка на токен и журнал доставки. Логи смотрите в Console.app с фильтром по процессу apsd.
Проверьте окружение: сборка из Xcode получает токен для sandbox APNs, а TestFlight и App Store работают с production. Перепутанное окружение даёт ошибку BadDeviceToken.
Где спотыкаются
Тестируют только открытое приложение. Самые частые баги живут в холодном старте по тапу.
Ждут тихий пуш после смахивания приложения и ищут поломку на сервере.
Забывают сценарий, где пользователь запретил уведомления: приложение должно нормально жить и без пушей.