element-ios/Riot/Categories/UNUserNotificationCenter.swift

54 lines
2.5 KiB
Swift

/*
Copyright 2020-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
import Foundation
import UserNotifications
import MatrixSDK
@objc extension UNUserNotificationCenter {
func removeUnwantedNotifications() {
UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
// get identifiers of notifications whose category identifiers are "TO_BE_REMOVED"
let identifiersToBeRemoved = notifications.compactMap({ $0.request.content.categoryIdentifier == Constants.toBeRemovedNotificationCategoryIdentifier ? $0.request.identifier : nil })
MXLog.debug("[UNUserNotificationCenter] removeUnwantedNotifications: Removing \(identifiersToBeRemoved.count) notifications.")
// remove the notifications with these id's
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiersToBeRemoved)
}
}
/// Remove call invite notifications for the given room id. If room id is not given. removes all call invite notifications.
/// - Parameter roomId: Room identifier to be removed call invite notifications for.
func removeCallNotifications(for roomId: String? = nil) {
func notificationShouldBeRemoved(_ notification: UNNotification) -> Bool {
if notification.request.content.categoryIdentifier != Constants.callInviteNotificationCategoryIdentifier {
// if not a call invite, should not be removed
return false
}
guard let roomId = roomId else {
// if a room id not provided, should be removed
return true
}
let roomIdInPush = notification.request.content.userInfo["room_id"] as? String
return roomId == roomIdInPush
}
UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
// get identifiers of notifications that should be removed
let identifiersToBeRemoved = notifications.compactMap({ notificationShouldBeRemoved($0) ? $0.request.identifier : nil })
MXLog.debug("[UNUserNotificationCenter] removeCallNotifications: Removing \(identifiersToBeRemoved.count) notifications.")
// remove the notifications with these id's
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiersToBeRemoved)
}
}
}