Как установить временной интервал доставки уведомлений

localnotification

#1

Добрый день!
Начал разбираться с UNUserNotificationCenter.
Таким типовым образом образом добавляю уведомления

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(self.minutes * 60),
repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)

Возник вопрос, как сделать так, чтобы уведомления доставлялись в определенный промежуток времени, например с 9 утра до 9 вечера?

Если я правильно понял, то сделав уведомление, оно отправляется в UNUserNotificationCenter и при этом должен сработать trigger (например повторяем уведомление каждый час)

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3600, repeats: true)

А каков механизм для установки промежутка показа уведомлений?
Вариант: Отменять уведомления в 9 вечера и потом отправлять новый request в 9 утра.
Если это одно уведомление, тогда мне понятно, но как быть если их много (у них разный текст, интервалы и тд.)
Или есть какой то другой вариант. Как это обычно реализуется?
Заранее благодарю.


#2

триггер, это не только повторение, а само событие отправки в целом (время).

С этим проблема, что если приложение неактивно, то как вы удалите повторяющееся каждый час уведомление? Если только пушем будить в бекграунде приложение и в делегате пуша удалить нужное уведомление по id.

Здесь проще выглядит реализация отправки множества отдельных уведомлений на конкретное время:
вам известен интервал отправки (9-21 час) ; вам известен интервал повторения (60 мин) -> известно количество уведомлений и точное время отправки. Отправляете 12 уведомлений на конкретное время и всё.
А вот если надо повторять каждый день в это время, то тут как раз у этих 12 уведомлений будет триггер вида Calendar.current.dateComponents([.hour, .minute], from: yourDate) - то есть час и минута. Триггер повторения в true будет запускать это уведомление в этот час и минуту, те каждый день.

Пример других триггеров:
еженедельно
Calendar.current.dateComponents([.weekday, .hour, .minute], from: yourDate)

ежемесячно
Calendar.current.dateComponents([.day, .hour, .minute], from: yourDate)

ежегодно
Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: yourDate)

Так вы сможете точно управлять на какое время доставляются уведомления. Кроме того вы сможете сделать “окна тишины”, удалив часть уведомлений, попадающих в нужный интервал.


#3

Большая благодарность!
Сергей, несколько уточнений.
Если необходимо отправлять уведомления каждые 5 минут, за 10 часов это 120 шт. не возникнет ли у UNUserNotificationCenter подозрение, что я спамлю его? =))
Тем более, что по моей идее уведомлений может быть несколько…


#4

Юзера пожалейте ))) Мне кажется после первого десятка юзер вообще отключит уведомления от вашего приложения…

Не знаю, так много не отправлял :slight_smile: