Ограничение локальных уведомлений, установленных на то же самое - PullRequest
0 голосов
/ 30 мая 2018

Я реализовал средство выбора даты для установки напоминаний, которые отправляют локальное уведомление.Во время тестирования я заметил, что могу установить напоминание несколько раз одновременно.Я предполагал, что система распознает, что я уже установил ее один раз в это конкретное время, и не сохранит другое напоминание.Удивительно, но приложение отправляло более одного уведомления одновременно.

Я подумал, что реализовал это неправильно, поэтому я решил протестировать приложение Clock по умолчанию.Опять же, я установил две тревоги одновременно и получил два уведомления одновременно:

enter image description here

Это нормальное поведение для уведомлений?Мои предположения неверны?Возможно, это было бы хорошо, когда пользователь хотел назначить разные сообщения отдельным уведомлениям.Однако в моем случае приложение должно напоминать пользователям об одной простой задаче со статическим сообщением.

Есть ли способ исправить эту «проблему»?На мой взгляд, если я уже установил напоминание, приложение все равно должно показывать, что новое напоминание было сохранено, но на самом деле не сохранять новое.

1 Ответ

0 голосов
/ 31 мая 2018

Это нормальное и намеченное поведение.Два уведомления могут иметь одинаковое время, но совершенно разные данные, поэтому они не ограничиваются одним уведомлением за единицу времени.

Я бы установил уникальный идентификатор уведомления и отслеживал их в массиве.

Вот пример:

let center = UNUserNotificationCenter.current()

// Setup content

let content = UNMutableNotificationContent()

content.title = "Notificaion title"

content.body = "Yoir text here"

content.sound = UNNotificationSound.default()

content.categoryIdentifier = "YouCanHaveDifferentCategories"

content.userInfo = ["myKey": "myValue"]

// Setup trigger time

var calendar = Calendar.current

let now = Date()

let date = calendar.date(byAdding: .second, value: 10, to: now)

let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: false)

// Create request

// Set any unique ID here. I use the UUID tools. This value is used by notificaion center, but I alsp store it in an array property of the relevant object in my data model, so the notification can be removed if the user deletes that object.
let uniqueID = UUID().uuidString

let request = UNNotificationRequest(identifier: uniqueID, content: content, trigger: trigger)

// Add the notification request
center.add(request)

Затем вы можете выборочно удалять уведомленияс этими методами, пока у вас есть запись в массиве или ваша модель данных идентификаторов.Вы можете передать массив для удаления сразу нескольких.

center.removePendingNotificationRequests(withIdentifiers: "UniqueID")

center.removeDeliveredNotifications(withIdentifiers: "UniqueID")
...