为什么没有使用removeDeliveredNotifications删除通知



直到最近(我相信在iOS 12发布之前(,使用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包含通知,并且正确提供了要删除的通知ID。

对于测试,调用removeAllDeliveredNotifications()可以工作并删除所有通知。

上述函数在override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)中调用

这里有什么问题?

我尝试了@Kymer的建议,并验证了在等待一段时间(例如3秒(后调用contentHandler为我解决了问题,例如

// 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);
});

相关内容

  • 没有找到相关文章