UNUserNotificationCenter.current(). GetDeliveredNotifications только когда-либо возвращает пустой массив
По сути, я просто пытаюсь напечатать уведомления о доставке моего приложения, но делаю что-то вроде:
UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
print(notifications)
}
просто отображает пустой массив в консоли Xcode, даже когда центр уведомлений содержит несколько доставленных уведомлений. (print(notifications.count)
возвращает 0)
я могу использовать getPendingNotificationRequests
чтобы успешно получать уведомления, которые запланированы, но еще не доставлены, обновлять их и даже удалять с removePendingNotificationRequests(withIdentifiers:)
, Но любая попытка получить доступ / изменить / удалить все, что было доставлено, не работает.
Я что-то упускаю здесь? Что-то изменилось в последнее время, когда iOS 10+ получает доступ к доставленным уведомлениям?
1 ответ
Я столкнулся с той же проблемой getDeliveredNotification
, массив уведомлений всегда был пустым.
Итак, я понял, что я устанавливал [UIApplication sharedApplication].applicationBadgeNumber
в 0
Что бы очистить все удаленные уведомления из центра уведомлений.
Теперь я установил applicationBadgeNumber
в 0
только после того, как я получу все ожидающие уведомления.
Он был пуст, когда я использовал его на UNNotificationServiceExtension
, оказалось, что мне нужно использовать семафор, чтобы расширение не возвращало 0 результатов:
let semaphore = DispatchSemaphore(value: 0)
let center = UNUserNotificationCenter.current()
center.getDeliveredNotifications { notifications in
defer {
semaphore.signal()
}
let relatedNotificationIdentifiers = notifications.filter { notification in
notification.request.content.userInfo["callId"] as? String == callId
&& notification.request.identifier != request.identifier
}.map(\.request.identifier)
// This call is async
center.removeDeliveredNotifications(withIdentifiers: relatedNotificationIdentifiers)
// ...so this call needs to be done with a slight delay because otherwise
// it will be killed before it is done removing the notifications
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
contentHandler(bestAttemptContent)
}
}
semaphore.wait()
Кроме того, в конце концов, потребовалось немного подождать, чтобы выполнить removeDeliveredNotifications
который также является асинхронным под капотом.
apns-collapse-id
может помочь уменьшить количество входящих сообщений APNS.