【发布时间】:2020-04-22 08:51:27
【问题描述】:
我知道有很多类似的问题和答案,我都查看了它们,但仍然找不到解决方案。尽管从UNUserNotificationCenter 中删除了预定通知,它仍然会被触发。
我按如下方式创建本地通知:
let aDF = DateFormatter()
aDF.dateFormat = "yyyy-MM-dd HH:mm:ss"
var identifierST = ""
if update == true {
identifierST = myCoreDataEntity.notificationUID!
} else {
identifierST = aDF.string(from: Date())
}
let notif = UNMutableNotificationContent()
notif.title = "some string"
notif.body = "some string"
var dateComp: DateComponents
switch myCoreDataEntity.schedule {
case 1: //daily
dateComp = Calendar.current.dateComponents([.hour, .minute], from: myCoreDataEntity.date)
case 2: //weekly
dateComp = Calendar.current.dateComponents([.weekday, .hour, .minute], from: myCoreDataEntity.date)
case 3: //monthly
dateComp = Calendar.current.dateComponents([.day, .hour, .minute], from: myCoreDataEntity.date)
case 4: //quartely - this is actually not quarterly, dont know how to set quarterly, setting monthly
dateComp = Calendar.current.dateComponents([.day, .hour, .minute], from: myCoreDataEntity.date)
case 5: //halfyearly - this is actually not halfyearly, dont know how to set halfyearly, setting monthly
dateComp = Calendar.current.dateComponents([.day, .hour, .minute], from: myCoreDataEntity.date)
case 6: //yearly
dateComp = Calendar.current.dateComponents([.month, .day, .hour, .minute], from: myCoreDataEntity.date)
default: //monthly
dateComp = Calendar.current.dateComponents([.day, .hour, .minute], from: myCoreDataEntity.date)
}
dateComp.hour = 10
dateComp.minute = 0
let notificationTrigger = UNCalendarNotificationTrigger(dateMatching: dateComp, repeats: true)
let request = UNNotificationRequest.init(identifier: timeStampST, content: notif, trigger: notificationTrigger)
UNUserNotificationCenter.current().add(request) { (error) in
if (error != nil) {
print (error) //notify user that reminder was not saved
} else {
myCoreDataEntity.notificationUID = identifierST
}
}
notificationUID 是 CoreData 实体上的字符串属性,我在其中存储创建的通知标识符,因此我可以稍后检索它。
上述工作正常,通知安排在指定的日期和时间发送,所以这里没有问题。
每当我需要删除特定通知时,我都会检索保存的通知标识符 (notificationUID) 并将其传递给以下函数:
func removeExisting(identifierST: String) {
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [identifierST])
}
在尝试查找问题时,我检索了所有待处理的通知,并将它们的 identifiers 与我传递给 removePendingNotificationRequests 的 identifierST 进行了比较,它们匹配
UNUserNotificationCenter.current().getPendingNotificationRequests(completionHandler: { requests in
for request in requests {
print("==============================================")
print(request.identifier)
print(request.content.title)
print(request.content.subtitle)
print(request.content.body)
}
})
但是那些被取消的通知仍然被触发,我在这里遗漏了一些明显的东西吗?
编辑 1
提供有关应用逻辑和场景的更多详细信息:
应用创建一些每天、每周、每月等重复的事件
为每个事件创建一个通知
在活动日期发送通知
用户可以看到即将发生的事件并且可以选择跳过一个周期 => 这是问题所在 -> 当用户选择跳过时,我运行
func removeExisting(identifierST: String)将其删除,但是当跳过的事件来了,通知还在发送中。
编辑 2
Re:删除通知时可能出现拼写错误或逻辑错误的要点 - 我确信那里没有错误的原因是因为它在我没有跳过或编辑事件时有效,但我正在删除它,即假设活动日期是明天,通知计划在明天 10:00 发送。今天用户决定他根本不想要这个并删除它,所以我运行func removeExisting(identifierST: String) 并且它有效 -> 明天不会生成该事件的通知。
但是,如果用户决定不完全删除,而是明天跳过 1 天,并在后天继续(如果计划是每天),这就是我遇到问题的地方。我尝试通过 3 种方法解决这种情况:
方法 1 - 删除现有通知并使用新标识符和新触发日期创建一个新通知 - 后天
方法 2 - 创建具有相同标识符的通知(假设这不会创建新的但会修改现有的)但新的触发日期 - 后天
方法 3 - 删除现有通知并创建一个具有相同标识符和新触发日期的新通知 - 后天
这些都不行。
【问题讨论】:
标签: swift ios13 unusernotificationcenter