我安排每天UserNorification
每天在特定时间触发,通知用户做某事。但是,如果用户在通知被解雇前X小时执行此操作,我需要取消今天的通知,在我看来取消所有通知,并从明天的特定时间再次重新安排。
例如,如果今天通知应该在11:00触发,并且用户"做那件事"在10:00,11:00的通知不应该被解雇,我需要在同一时间再次安排,但从明天开始。循环一直持续,明天也是如此。
我的问题是:
我是否应该使用以下代码取消预先安排第一天的通知:UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
?
如何安排从特定日期开始的每日通知?
答案 0 :(得分:3)
不幸的是,这种调度在iOS 10中的通知框架变得异常艰难。我能找到类似的东西的唯一方法是使用UNCalendarNotificationTrigger
和UNTimeIntervalNotificationTrigger
的混合并实现UNNotificationContentExtension
。
概念如下:
每次执行您的操作时,您都需要重新安排通知。如果时间早于所需的通知时间(例如,在您的示例中为11:00),而不是使用日历触发器重新安排,请使用时间间隔触发器为第二天设置一个临时的非重复通知(让& #39; s称之为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
将不会被安排)但它涵盖了大多数情况。我很高兴找到比这更好的方法......
答案 1 :(得分:1)
经过研究,使用新的UserNotifications
框架是不可能的。我们必须使用旧的UILocalNotification
方法来实现这一目标。由于该代码在iOS10中已弃用,我已将支持的版本更改为9+,因此不会出现警告。这是一种永久的方法,但希望Apple能够在新框架中实现和扩展旧功能。