Почему уведомления не удаляются с помощью removeDeliveredNotifications?
До недавнего времени (я полагаю, до выпуска iOS 12) удаление удаленных push-уведомлений из Центра уведомлений работало, как и ожидалось, с помощью removeDeliveredNotifications
,
Внезапно, без какого-либо изменения кода в расширении службы уведомлений, уведомления больше не удаляются.
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
self.content = request.content.mutableCopy() as? UNMutableNotificationContent
guard let content = content else {
contentHandler(request.content)
return
}
UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
let matchingNotifications = notifications.filter({ $0.request.content.threadIdentifier == "myThread" && $0.request.content.categoryIdentifier == "myCategory" })
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: matchingNotifications.map({ $0.request.identifier }))
contentHandler(content)
}
}
Функция просто завершается без удаления уведомления. При отладке на реальном устройстве это показывает, что matchingNotifications
содержит уведомления, и идентификаторы уведомлений, которые нужно удалить, предоставлены правильно.
Для тестирования звоню removeAllDeliveredNotifications()
работает и удаляет все уведомления.
Вышеприведенная функция вызывается в override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
В чем здесь проблема?
0 ответов
Я попробовал предложение Kymer и подтвердил, что вызовcontentHandler
после ожидания некоторого времени (например, 3 секунды) проблема для меня решена, например
// UNUserNotificationCenter *notificationCenter
// NSArray(NSString *) *matchingIdentifiers;
// UNNotificationContent *content;
if (matchingIdentifiers.count > 0) {
NSLog(@"NotificationService: Matching notification identifiers to remove: %@.", matchingIdentifiers);
[notificationCenter removeDeliveredNotificationsWithIdentifiers:matchingIdentifiers];
// Note: dispatch delay is in nanoseconds... :(
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3000000000), dispatch_get_main_queue(), ^{
NSLog(@"Replacing content after 3 seconds.");
self.contentHandler(content);
});
}
Я думаю, это означает, что это проблема времени: iOS агрессивно замораживает процесс после contentHandler
вызывается и удаляет все ожидающие запросы на удаление в notificationCenter
РЕДАКТИРОВАТЬ: хотя вопрос не в том, как с этим бороться, раздел комментариев вызвал опасения по поводу произвольной задержки по времени. В моем тестировании было достаточно публикации обратного вызова в другом цикле, например
dispatch_async(dispatch_get_main_queue(), ^{
contentHandler(content);
});