Как удалить удаленное уведомление из центра уведомлений, используя платформу UserNotifications
Я видел несколько тем на эту тему здесь и в других местах, но, похоже, ни одна из них не использует новую UserNotifications
рамки для iOS 10
Есть метод экземпляра getDeliveredNotifications(completionHandler:)
это называется UNUserNotificationCenter
одноэлементная функция current()
completionHandler:
принимает массив доставленных уведомлений, которые затем могут быть удалены внутри блока с помощью removeDeliveredNotifications(withIdentifiers:)
UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
// UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [String])
}
Моя задача состоит в том, как определить конкретное уведомление из всех доставленных уведомлений и затем удалить его?
Это то, что я делаю сейчас, чтобы увидеть, есть ли удаленное уведомление, доставленное с идентификатором, который я отправил с сервера с ключом полезной нагрузки. ID
, Это не удаляет рассматриваемое уведомление, очевидно, потому что первая функция возвращает nil, хотя уведомление видно в центре уведомлений.
func isThereANotificationForID(_ ID: Int) -> UNNotification? {
var foundNotification: UNNotification?
UNUserNotificationCenter.current().getDeliveredNotifications {
DispatchQueue.main.async {
for notification in notifications {
if notification.request.content.userInfo["id"] as! Int == ID {
foundNotification = notification
}
}
}
}
return foundNotification
}
func removeNotification(_ notification: UNNotification) {
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [notification.request.identifier])
}
// Find the notification and remove it
if let deliveredNotification = isThereANotificationForID(ID) {
removeNotification(deliveredNotification)
}
1 ответ
Обратите внимание, что этот ответ использует Swift 5 и протестирован на iOS 13.
Мы можем продлить UNUserNotificationCenter
чтобы удалить уведомление (я) по нашему выбору. Лично я группирую их по потокам и удаляю их таким образом, но это расширение также включает способ удаления по словарной паре.
extension UNUserNotificationCenter {
func decreaseBadgeCount(by notificationsRemoved: Int? = nil) {
let notificationsRemoved = notificationsRemoved ?? 1
DispatchQueue.main.async {
UIApplication.shared.applicationIconBadgeNumber -= notificationsRemoved
}
}
func removeNotifications(_ notifications: [UNNotification], decreaseBadgeCount: Bool = false) {
let identifiers = notifications.map { $0.request.identifier }
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiers)
if decreaseBadgeCount {
self.decreaseBadgeCount(by: notifications.count)
}
}
func removeNotifications<T: Comparable>(whereKey key: AnyHashable, hasValue value: T, decreaseBadgeCount: Bool = false) {
UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
let notificationsToRemove = notifications.filter {
guard let userInfoValue = $0.request.content.userInfo[key] as? T else { return false }
return userInfoValue == value
}
self.removeNotifications(notificationsToRemove, decreaseBadgeCount: decreaseBadgeCount)
}
}
func removeNotifications(withThreadIdentifier threadIdentifier: String, decreaseBadgeCount: Bool = false) {
UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
let notificationsToRemove = notifications.filter { $0.request.content.threadIdentifier == threadIdentifier }
self.removeNotifications(notificationsToRemove, decreaseBadgeCount: decreaseBadgeCount)
}
}
func removeNotification(_ notification: UNNotification, decreaseBadgeCount: Bool = false) {
removeNotifications([notification], decreaseBadgeCount: decreaseBadgeCount)
}
}
Имея этот добавочный номер, вы можете позвонить, например,
UNUserNotificationCenter.current().removeNotifications(whereKey: "id", hasValue: 123)
Если вы также хотите уменьшить номер значка на значке приложения, вы можете установить decreaseBadgeCount: true
, или поочередно позвонить UNUserNotificationCenter.current().decreaseBadgeCount
.
Previosly removeDeliveredNotifications
не работает должным образом. Кажется, что Apple была исправлена проблема, потому что это будет работать для меня, используя одну строку кода.
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: aryIdentifier)
Я пытался 5-6 часов в симуляторе, чтобы очистить локальное уведомление, но не повезло. Когда я буду запускать код в реальном устройстве, ему понравится очарование.
ПРИМЕЧАНИЕ: пожалуйста, проверьте в реальном устройстве, выше метод не работает в симуляторе.