我注意到如果我创建一个带有自定义日期的UNCalendarNotificationTrigger
,除非我放入,否则它不会被添加:
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: **true**)
Apple示例是:
let date = DateComponents()
date.hour = 8
date.minute = 30
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
有意义重复== true。
在我的场景中,我不需要创建一个重复多次的通知,但是我需要在特定的日历日期(当然是将来)只触发一次多次通知。
如果我在做:
let calendar = Calendar(identifier: .gregorian)
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
let newdate = formatter.date(from: "20161201")
let components = calendar.dateComponents(in: .current, from: newdate!)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: false)
然后我总是收到0待处理通知......
UNUserNotificationCenter.current().getPendingNotificationRequests(completionHandler: { (notifications) in
print("num of pending notifications \(notifications.count)")
})
num of pending notification 0
有什么想法吗?
EDIT1: 添加其中一个答案指出的其他上下文。 我实际上是将请求添加到当前的UNUserNotificationQueue。
let request = UNNotificationRequest(identifier: "future_calendar_event_\(date_yyyyMMdd)", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
// Do something with error
print(error.localizedDescription)
} else {
print("adding \((request.trigger as! UNCalendarNotificationTrigger).dateComponents.date)")
}
}
答案 0 :(得分:5)
我有同样的问题,现在我解决了。这是由于dateComponents的一年。
为了解决这个问题,我测试了以下代码:
let notificationCenter = UNUserNotificationCenter.current()
let notificationDate = Date().addingTimeInterval(TimeInterval(10))
let component = calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: notificationDate)
print(component)
let trigger = UNCalendarNotificationTrigger(dateMatching: component, repeats: false)
let request = UNNotificationRequest(identifier: item.addingDate.description, content: content, trigger: trigger)
self.notificationCenter.add(request){(error) in
if let _ = error {
assertionFailure()
}
}
在控制台中,打印component
:
year: 106 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false
在这种情况下,无法在待处理通知列表中找到通知。
component
年定为2017年时:let notificationDate = Date().addingTimeInterval(TimeInterval(10))
var component = calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: notificationDate)
component.year = 2017
print(component)
let trigger = UNCalendarNotificationTrigger(dateMatching: component, repeats: false)
let request = UNNotificationRequest(identifier: item.addingDate.description, content: content, trigger: trigger)
self.notificationCenter.add(request){(error) in
if let _ = error {
assertionFailure()
}
}
在控制台中,component
为:
year: 2017 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false
然后可以在待处理通知列表中找到此通知。
然后,我检查待处理的通知请求,以查找触发日期的年份组件是106还是2017:
notificationCenter.getPendingNotificationRequests(){[unowned self] requests in
for request in requests {
guard let trigger = request.trigger as? UNCalendarNotificationTrigger else {return}
print(self.calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: trigger.nextTriggerDate()!))
}
}
我发现触发器的nextTriggerDate组件是:
year: 106 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false
因此,如果您想将触发器的重复设置为false,则应确保触发日期大于当前日期。
默认的dateComponents年份可能不合适,例如106.如果您希望在2017年触发通知,则应明确将组件年份设置为2017。
也许这是一个错误,因为我将触发器的dateComponents'年设置为2017年,但在nextTriggerDate的待处理通知请求中获得106。
答案 1 :(得分:0)
在我的应用程序上,我在错误设置的通知后请求权限。因此,如果我要获取待处理的通知计数,则为0。
我请求了对AppDelegate的许可,但在第一个视图viewdidload()上设置了通知。我添加了一个通知功能来触发按钮。获得许可后,单击按钮,最后设置我的通知,我得到了待处理的通知计数1。
希望对您有所帮助。
答案 2 :(得分:-2)
UNCalendarNotificationTrigger
创建应发生通知的计划,但不执行计划。为此,您需要创建UNNotificationRequest
,然后将其添加到通知中心。有点像:
let request = UNNotificationRequest(identifier: "MyTrigger", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
// Do something with error
} else {
// Request was added successfully
}
}