Я читал Apple Docs и некоторые другие источники.Но не могу найти ответ.
Проблема заключается в следующем:
Условия :
- Удаленное push-уведомление, которое получает приложениечувствителен ко времени и должен доставляться на устройство как можно скорее.
- Уведомление содержит информацию, необходимую для любого запускаемого пользователем приложения (т. е. независимо от того, нажимают ли они на уведомление или нет).
Сценарий :
- Удаленное push-уведомление отправляется на устройство, когда приложение не запущено (не в фоновом режиме, но вообще не работает).
- Пользователь не нажимает на уведомление.Вместо этого пользователь нажимает на значок приложения.
Похоже, что в этом случае нет способа получать содержимое уведомления при запуске приложения.Уведомление не теряется: оно остается в области уведомлений до тех пор, пока пользователь не щелкнет по нему, но содержимое уведомления не передается приложению при запуске приложения.
Что я пробовал до сих пор
Мне удалось получить содержимое уведомления в любом другом сценарии:
У меня есть обработчик
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler <...>
, когда приложение находится на переднем плане
Когда приложение находится в фоновом режиме, обработчик
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: <...>
В качестве меры безопасности я также перебираю выдающиеся уведомления, такие как:
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions <...> {
UNUserNotificationCenter.current()
.getDeliveredNotifications {
(notifications: [UNNotification]) -> Void in
И, в той же функции, я проверяю, содержит ли launchOptions
какие-либо уведомления.
С этой комбинацией похоже, что я могу охватить каждый сценарий, кромедля случая, который я изложил выше.То есть: когда пользователь нажимает на значок приложения, когда приложение не запущено после доставки уведомления:
didReceiveRemoteNotification:fetchCompletionHandler
не вызывается UNUserNotificationCenter.current().getDeliveredNotifications
возвращает 0 уведомлений (хотя уведомлениев области уведомлений). - В
didFinishLaunchingWithOptions
значение launchOptions
равно alos nil ...
Эта статья , кажется, подтверждает это поведение,но не дает никакого решения.
Я также видел этот вопрос, но, хотя это может быть приемлемым решением для нужд ОП, он не дает прямого ответа на его вопрос, так как использование флага content-available
меняет способ уведомлениядоставлено (см. Настройка фонового уведомления об обновлении в разделе на этой странице , а также уменьшает его приоритет, как объяснено в apns-priority
разделе на этой странице.
Кстати, если я нажму на уведомление после открытия приложения, поведение будет таким, как ожидалось, поэтому уведомление не полностью потеряно для приложения, оно просто не предоставляется при его запуске.
Так что яИмея дело с этим - какой-то крайний случай, ошибка или, возможно, такое поведение предназначено - если так, то почему?
Заранее спасибо.