Планирование уведомления с помощью 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 вопроса.
В моей функции была строка кода, которая удаляла все предыдущие уведомления, настроенные во время итерации моего цикла, поэтому я закомментировал следующую строку кода, но все по-прежнему не работало, как ожидалось.
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
Я обнаружил, что запланировал свое уведомление с тем же запросом идентификатора, который оставил мне только одно уведомление за последний день. Я просто добавил индекс в конец моей пользовательской переменной ID с интерполяцией строк, например, так:
let requestId = "textNotification\(day)"