不幸的是,这种调度对于 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 */
当收到此通知时(并假设 aUNNotificationContentExtension
已实现),在didReceive:
通知到达时调用的扩展的视图控制器方法中,取消现有通知并使用日历触发器正常安排实际的重复通知(让我们称之为actualNoticfication
)
let date = DateComponents()
date.hour = 11
date.minute = 00
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
/* schedule actualNotification */
这是一个漫长的解决方法,可能不是很有效,也不是 100% 可靠(例如,如果设备在tempNotification
到达时关闭,则actualNotification
不会安排),但它涵盖了大多数情况。我会很高兴找到比这更好的方法...