首页 文章

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

提问于
浏览
4

我安排每天 UserNorification 在特定时间每天触发,通知用户做某事 . 但是如果用户在通知被触发前X小时执行此操作,我需要在今天's notification, in my opinion cancel all, and reschedule again but from tomorrow'取消特定时间 . 例如,如果今天通知应该在11:00触发,而用户"do that thing"在10:00触发,则不应该触发11:00通知,并且我需要在同一时间再次安排,但从明天开始 . 循环一直持续,明天也是如此 . 我的问题是:

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

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

2 回答

  • 1

    不幸的是,这种调度在iOS 10中的通知框架变得异常艰难 . 我能找到类似的东西的唯一方法是使用 UNCalendarNotificationTriggerUNTimeIntervalNotificationTrigger 的混合并实现 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 将不会被安排),但它涵盖了大多数情况 . 我会很高兴找到比这更好的方法......

  • 3

    经过研究,使用新的 UserNotifications 框架是不可能的 . 我们必须使用旧的 UILocalNotification 方法来实现这一目标 . 因为在iOS10中不推荐使用该代码,所以我将支持的版本从9更改为,因此不会出现警告 . 这是一种永久的方法,但希望Apple能够在新框架中实现和扩展旧功能 .

相关问题