У меня есть код, который работал до недавнего времени. Предполагается запланировать количество локальных уведомлений на основе списка указанных дат.
Код выглядит так:
static func scheduleNotifications()
{
// Here, a list of dates when notifications should appear is
// created. This is called pendingNotifications. It contains
// a list of dates and the number of events on that date
...
// Now I want to schedule up to 20 local notifications for
// each of the dates. The badge should show the number of events
let sortedDates = pendingNotifications.keys.sorted()
for i in 0 ..< min(20, sortedDates.count)
{
let notificationDate = ...
let content = UNMutableNotificationContent()
content.title = "The title"
content.body = "The description"
content.sound = UNNotificationSound.default()
content.badge = NSNumber(value: pendingNotifications[sortedDates[i]]!)
let ident = UUID().uuidString
let trigger = UNCalendarNotificationTrigger(dateMatching: calendar.dateComponents(in: calendar.timeZone, from: notificationDate), repeats: false)
let request = UNNotificationRequest(identifier: ident, content: content, trigger: trigger)
let center = UNUserNotificationCenter.current()
center.add(request) { error in
center.getPendingNotificationRequests() { requests in
print(requests.count)
}
}
}
}
Этот код выполняется без ошибок, но счетчик запросов, который я печатаю в обработчике завершения, всегда выдает 0, и я не получаю никаких уведомлений.
Тогда у меня есть вторая функция, которая просто планирует пример уведомления независимо от любых других критериев:
static func scheduleSampleNotification()
{
let content = UNMutableNotificationContent()
content.title = "Test"
content.body = "Sample Notification!"
content.sound = UNNotificationSound.default()
content.badge = 5
let ident = UUID().uuidString
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false)
let request = UNNotificationRequest(identifier: ident, content: content, trigger: trigger)
let center = UNUserNotificationCenter.current()
center.add(request)
}
Если я добавлю строку к scheduleNotifications
, которая вызывает scheduleSampleNotification
прямо перед комментарием, который я написал о списке создаваемых дат, количество ожидающих запросов всегда будет равно 1, и примерное уведомление также появится через минуту.
Я на самом деле не знаю, что я делаю здесь неправильно, и я немного растерялся, тем более, что тот же код работал нормально, прежде чем я изменил минимальную требуемую версию iOS с 9 на 10.3 (в предыдущей версии я проверял работал ли я на iOS 9 и использовал старый способ предоставления локальных уведомлений - теперь я удалил этот код, начиная с 10.3. Я понимаю, что вы должны использовать UNUserNotificationCenter
).
Я тестирую в симуляторе и на устройстве iOS 12. Я использую XCode 10.1.
EDIT
Интересно: когда я изменяю с UNCalendarNotificationTrigger
на UNTimeIntervalNotificationTrigger
, все уведомления планируются. Может быть, что-то не так с моим курком - но все даты в будущем?
РЕДАКТИРОВАТЬ 2
ОК, я нашел проблему. Очевидно, что следующее больше не работает:
let dateComponents = calendar.dateComponents(in: calendar.timeZone, from: notificationDate)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
пока работает следующее:
let dateComponents = calendar.dateComponents([.day, .month, .year, .hour, .minute], from: notificationDate)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
Понятия не имею почему, тем более, что раньше работало ...