6

我正在安排UserNorification每天在特定时间触发,通知用户做某事。但是,如果用户在通知触发前 X 小时这样做,我需要取消今天的通知,在我看来取消所有,然后重新安排,但从明天的特定时间开始。例如,如果今天通知应该在 11:00 触发,而用户在 10:00 “做那件事”,则不应该触发 11:00 通知,我需要在同一时间再次安排,但从明天开始. 循环继续下去,明天也一样。我的问题是:

  1. 我是否应该使用以下代码取消安排第一次每日通知:UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

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

4

2 回答 2

3

不幸的是,这种调度对于 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 */

当收到此通知时(并假设 aUNNotificationContentExtension已实现),在didReceive:通知到达时调用的扩展的视图控制器方法中,取消现有通知并使用日历触发器正常安排实际的重复通知(让我们称之为actualNoticfication

let date = DateComponents()
date.hour = 11
date.minute = 00 
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
/* schedule actualNotification */

这是一个漫长的解决方法,可能不是很有效,也不是 100% 可靠(例如,如果设备在tempNotification到达时关闭,则actualNotification不会安排),但它涵盖了大多数情况。我会很高兴找到比这更好的方法...

于 2016-12-20T14:26:55.700 回答
0

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

于 2017-01-19T12:42:16.993 回答