SWiftUI - 在本地通知中访问 UUID.uuidString 标识符

SWiftUI - Access UUID.uuidString Identifier in Local Notification

如何在添加通知后访问 UUID.uuidString 标识符?假设我想删除该通知,我该如何调用它?

我不能为一个项目使用唯一的字符串,因为我可能在不同的核心数据实体中有两个不同时间的通知,如果我对 on 使用一个字符串,它将影响同一项目的所有通知。

// Notification
                                        
let content = UNMutableNotificationContent()
content.title = self.test.testData[item].title
content.body = "Notification"
content.sound = UNNotificationSound.default
                                        
var dateComponents = DateComponents()
dateComponents.weekday = 5 
dateComponents.hour = 6
dateComponents.minute = 13
                                        
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
                                        
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
                                        
UNUserNotificationCenter.current().add(request)

使用 UUID.init().uuidString 对象创建一个唯一标识符,并在创建新通知时将其保存到您的 managedObject,如下所示。

// A unique identifier
let identifier = UUID.init().uuidString

// Managed Object
let managedObject = Notifications(context: context)
managedObject.setValue(identifier, forKey: "identifier")
//...

// Notification Content
let content = UNMutableNotificationContent.init()
//...

let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
//...

然后您可以随时取消通知。

context.delete(managedObject)
if context.hasChanges {
    do {
        // Cancel the registered notification with given identifier
        if let identifier = managedObject.value(forKey: "identifier") as? String {
            let center = UNUserNotificationCenter.current()
            center.removeDeliveredNotifications(withIdentifiers: [identifier])
            center.removePendingNotificationRequests(withIdentifiers: [identifier])
        }
        try context.save()
    } catch {
        fatalError()
    }
}

NOTE: This is a non-repeatable notification content.

由于您要添加与 testData 中的特定元素相对应的本地通知,您可以将新的 attribute 添加到 Core Data 对象 testData 并将其命名notificationIdentifier。为 testData 核心数据实体重新创建模型,然后在将 testData 实体保存到核心数据之前设置 notificationIdentifier 值。

let notificationIdentifier = UUID().uuidString
let request = UNNotificationRequest(identifier: notificationIdentifier, content: content, trigger: trigger)
//...
UNUserNotificationCenter.current().add(request)
//...
testEntity.notificationIdentifier = notificationIdentifier

在这里您可以获得特定 testEntitynotificationIdentifier 并且您可以从标识符中删除旧的本地通知并使用新的 notificationIdentifier 创建新的本地通知并更新新的notificationIdentifier 到核心数据 testEntity