[решено] LocalNotification


#1

:hugs:

У меня остались 2 последних и самых, как мне показалось, непростых для меня вопроса, это LocalNotification и резервное копирование в хранилище iCloud

Помогите разобраться с LocalNotification. У меня задача такая: при создании ячейки, через датаПикер я устанавливаю дату определенную, по этой дате должно либо быть напоминание, либо не быть, либо быть с + за один час. Важно, чтобы быть, не быть и за 1 час можно было изменять + изменять саму дату. То есть работала целая связка. Например выставили дату на 11:00 29 декабря 2018 года и нажали свич уведомить, автоматически активировалось уведомление. Потом изменили дату, но уведомление не трогали, соответственно дата изменена, а значит и дата уведомления должна измениться, если вдруг выключили уведомление - то ранее назначенное должно быть удалено и не сработать, ровно как если удалили ячейку, удалилось и уведомление к ней, которое было ранее установлено. Вот. У меня остается меньше недели, т.к. аппстор написал уведомление, что кажется до 23 нужно всё им отправить, из-за праздников. Пожалуйста :pray: подскажите самый короткий пусть, чтобы реализовать вот такую штуку.


#2

Напишите завтра в личку. Попробую написать вам пример. А то приходится болеть за вас в споре, оппонента то я не знаю :joy:

Если у вас готов датапикер, то могу на основе него написать код по этой задаче. С КлаудКит все немного сложней. Если готовы доехать до моей работы, то могу провести вас через этот процесс.

Этого достаточно, чтобы выиграть ваш спор?


#3

Это всё делается несложно:
т.к. уведомления ставятся в очередь с определённым идентификатором, то для изменения уведомления, которое уже стоит в очереди (отправлено), достаточно отправить новое с таким же идентификатором - оно заменит предыдущее. Удаляются так же просто - просто удаляете обычной командой уведомление из центра с нужным идентификатором и всё.

например:

постановка (отправка) уведомления
пример:

func sendNotification(title: String, body: String, identifier: String, date: Date, repeats: Bool) {
    let content = UNMutableNotificationContent()
    content.title = title
    content.body = body
    content.sound = UNNotificationSound.default()
    let dateComponents = customTrigger(date: date, hour: 12)
    let calendarTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: repeats)
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: calendarTrigger)
    let center = UNUserNotificationCenter.current()
    center.add(request, withCompletionHandler: nil)
}

func customTrigger(date: Date, hour: Int?)->(DateComponents) {
    let calendar = Calendar.current
    let year = calendar.component(.year, from: date)
    let month = calendar.component(.month, from: date)
    let day = calendar.component(.day, from: date)
    var dateComponents = DateComponents()
    dateComponents.year = year
    dateComponents.month = month
    dateComponents.day = day
    dateComponents.hour = hour
    dateComponents.minute = 00
    dateComponents.timeZone = TimeZone.current
    return dateComponents
}

для установки времени я для удобства использую свою функцию customTrigger(), чтобы точно настраивать когда отправить уведомление - в данном случае просто контролирую час отправки в дате, которая указывается в коде (или получаю от пользователя). Можно установить любую дату используя DateComponents()

удаление

func removeNotification(identifier: [String]) {
    let center = UNUserNotificationCenter.current()
    center.removePendingNotificationRequests(withIdentifiers: identifier)
    print("\(identifier) notification deleted!")
}

обратите внимание, что передаётся массив идентификаторов - так что можно уведомления удалять “пачками”

Т.к. центр уведомлений в системе не зависит от приложения, то уведомления, установленные на определённое время, сработают независимо от того, работает приложение или нет. Здесь важно, как мне кажется, следить за вашими отправленными уведомлениями, чтобы не пришло то, что уже неактуально и контент удалён, и вовремя их удалять из очереди.


#4

наверное лучше всё же примеры здесь оставлять, хотя понятно, что “они есть везде” - люди же спрашивают и многие не знают. Хотя согласен - нужно уж уметь пользоваться поиском и гуглом )) Хотя с другой строны всё это (ответы) увеличивают трафик на сайт :smile:


#5

Хорошо, спасибо! Но я тоже попробую разобраться в этом всём.
Всего достаточно, с клаудКитом в самом конце, потому что у меня едет крыша … вот правда, меня люди уже не узнают )))


#6

ОГРОМНОЕ ВСЕМ СПАСИБО ЗА ТО, что разжевываете подробно и терпеливо :hugs: :hugs: :hugs: :hugs:


#7

Дело не в этом. Тут помощь с определенным проектом. Не бывает универсальных решений. Поэтому лучше разобраться подробней


#8

ну и соответственно таймзон автоматом ставится своя по системе, но этим тоже можно играться )


[решено] UIDatePicker и 00 в секундах?
#9

Получилось, разобралась, в сумме часов за 5 … есть ещё мелкие вопросы, но это уже дополнительно к основному функционалу)