Я знаю, что есть много похожих вопросов и ответов, и я просмотрел их все, но все еще не могу найти решение. Несмотря на удаление запланированного уведомления из 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
с identifierST
, который я передаю removePendingNotificationRequests
, и они match
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
Чтобы предоставить немного подробнее о логике приложения c и сценарии ios:
Приложение создает некоторые события, повторяющиеся ежедневно, еженедельно, ежемесячно и т. д. c
для каждого событие создается уведомление
Уведомление отправляется в день события
Пользователь может видеть предстоящие события и может выбрать пропустить один цикл => вот в чем проблема -> когда пользователь решил пропустить, я запускаю func removeExisting(identifierST: String)
, чтобы удалить его, но когда наступает дата этого пропущенного события, уведомление все еще отправляется.
Редактировать 2
Re: ошибка возможной опечатки или лога c при удалении уведомления - причина, по которой я уверен, что ошибки нет, заключается в том, что это работает, когда я не пропускаю и не редактирую событие, но удаляю его, то есть предположим, что дата события - завтра, а уведомление планируется доставить завтра в 10:00. Сегодня пользователь решает, что он вообще не хочет этого, и удаляет его, поэтому я запускаю func removeExisting(identifierST: String)
, и это работает -> завтра не генерируется уведомление об этом событии.
Но, если пользователь решает не удалять полностью, а просто пропустить 1 день завтра и продолжить с послезавтра (в случаях, когда расписание является ежедневным), это - то, где я получаю проблему. Я пытался рассмотреть этот сценарий в 3 подходах:
Подход 1 - Удалить существующее уведомление и создать новое с новым идентификатором и новой датой запуска - послезавтра
Подход 2 - Создать уведомление с тем же идентификатором (при условии, что это не создаст новый, но изменит существующий), но с новой датой запуска - послезавтра
Подход 3 - Удалить существующее уведомление и создать новое с тем же идентификатором и новой датой запуска - послезавтра
Ничего из этого не работает.