Почему уведомления не удаляются с помощью removeDeliveredNotifications? - PullRequest
0 голосов
/ 10 декабря 2018

До недавнего времени (я полагаю, до выпуска 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)

В чем здесь проблема?

1 Ответ

0 голосов
/ 19 июня 2019

Я попробовал предложение @ 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);
});
...