从iOS 10中的自定义日期开始取消并重新安排UserNotification(旧UILocalNotification)

时间:2016-12-17 19:10:20

标签: ios iphone usernotifications

我安排每天UserNorification每天在特定时间触发,通知用户做某事。但是,如果用户在通知被解雇前X小时执行此操作,我需要取消今天的通知,在我看来取消所有通知,并从明天的特定时间再次重新安排。 例如,如果今天通知应该在11:00触发,并且用户"做那件事"在10:00,11:00的通知不应该被解雇,我需要在同一时间再次安排,但从明天开始。循环一直持续,明天也是如此。 我的问题是:

  1. 我是否应该使用以下代码取消预先安排第一天的通知:UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

  2. 如何安排从特定日期开始的每日通知?

2 个答案:

答案 0 :(得分:3)

不幸的是,这种调度在iOS 10中的通知框架变得异常艰难。我能找到类似的东西的唯一方法是使用UNCalendarNotificationTriggerUNTimeIntervalNotificationTrigger的混合并实现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能够在新框架中实现和扩展旧功能。