Планирование уведомления с помощью Swift 3 для массива дат

У меня есть массив, содержащий мои даты. Я хочу запланировать уведомления на эти дни в 6:30 утра.

Я следовал руководству по appcoda, которое помогает планировать уведомление при вводе данных от средства выбора даты, что замечательно, но я немного не уверен в том, как вызвать мою функцию, чтобы запланировать уведомление только на заданные дни.

Итак, мой вопрос, как и где вызвать функцию?

  • дни подряд
  • можно назначить функции начальную дату и повторить ее с количеством элементов в массиве?

Ниже моя функция:

    func scheduleNotification(at date: Date) {
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents(in: .current, from: date)
        let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: 6, minute: 30)
        let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: false)

        let content = UNMutableNotificationContent()
        content.title = "Advent Calendar"
        content.body = "Just a reminder to open your present!"
        content.sound = UNNotificationSound.default()

        let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger)
 UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
        UNUserNotificationCenter.current().add(request) {(error) in
            if let error = error {
                print("Uh oh! We had an error: \(error)")
            }
        }
    }

1 ответ

Решение

Итак, после консультации с разработчиком @gklka я решил использовать простой цикл for, который повторяется 24 раза), и он передает индекс в свойство дня функции, где я предварительно сконфигурировал часы, минуты, год и месяц следующим образом:

func scheduleNotification(day: Int) {

    var date = DateComponents()
    date.year = 2016
    date.month = 11
    date.day = day
    date.hour = 6
    date.minute = 30

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

и цикл for:

for index in 1...24 {
        scheduleNotification(day: index)
    }

Поскольку у меня все настроено в AppDelegate, я вызываю функцию в didFinishLaunchingWithOptions

Обновление от 1 декабря

Таким образом, я оставил все как есть, но никакого уведомления не произошло утром., Я заглянул в свой код, чтобы понять, почему. Было 2 вопроса.

  1. В моей функции была строка кода, которая удаляла все предыдущие уведомления, настроенные во время итерации моего цикла, поэтому я закомментировал следующую строку кода, но все по-прежнему не работало, как ожидалось. UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

  2. Я обнаружил, что запланировал свое уведомление с тем же запросом идентификатора, который оставил мне только одно уведомление за последний день. Я просто добавил индекс в конец моей пользовательской переменной ID с интерполяцией строк, например, так: let requestId = "textNotification\(day)"

Другие вопросы по тегам