К сожалению, такой вид планирования стал до смешного сложным с фреймворком уведомлений в iOS 10. Единственный способ, которым я мог найти что-то подобное, - это использовать гибрид UNCalendarNotificationTrigger
и UNTimeIntervalNotificationTrigger
И реализовать UNNotificationContentExtension
.
Концепция следующая:
Каждый раз, когда выполняется ваше действие, вам необходимо перенести уведомления. Если время раньше, чем желаемое время уведомления (например, 11:00 в вашем примере), вместо использования календарного триггера для перепланирования используйте триггер временного интервала, чтобы установить одно временное неповторяющееся уведомление на следующий день (давайте назовите это tempNotification
)
let nextDayAt11AMDate = /* the timestamp of tomorrow at 11am */
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: nextDayAt11AMDate.timeIntervalSinceDate(NSDate()), repeats: false)
/* schedule tempNotification */
Когда это уведомление получено (и при условии, что UNNotificationContentExtension
был реализован), в контроллере представления вашего расширения didReceive:
метод, который вызывается при получении уведомления, отмените существующие уведомления и запланируйте фактическое повторяющееся уведомление, обычно используя триггер календаря (назовем его actualNoticfication
)
let date = DateComponents()
date.hour = 11
date.minute = 00
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
/* schedule actualNotification */
Это долгий обходной путь, вероятно, не очень эффективный и не на 100% надежный (например, если устройство закрывается, когда приходит tempNotification
, то actualNotification
не будет запланировано), но он охватывает большинство случаев. Я был бы очень рад найти способ получше ...
person
spassas
schedule
20.12.2016
UNNotificationContentExtension
)? - person spassas   schedule 20.12.2016