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.

Другие вопросы по тегам