问题描述
当地通知应该在2021年9月25日发出。下面是Fire Time的打印对象
?年:2021年月:9天:26 isLeapMonth:False
- 年份:2021年
- 月份:9
- 天:25
- isLeapMonth:False
let content = UNMutableNotificationContent() content.title = "Test title" content.body = "sample test body" var trigger:UNCalendarNotificationTrigger let n = 1 let nextTriggerDate = Calendar.current.date(byAdding: .day, value: n, to: Date())! let comps = Calendar.current.dateComponents([.year, .month, .day], from: nextTriggerDate) trigger = UNCalendarNotificationTrigger(dateMatching: comps, repeats: false) content.subtitle = "Sub title-Date-NonRepeat" let request = UNNotificationRequest(identifier: "test.my.example", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) { Error in if let err = Error { print("Notification Error:(String(describing: err))") } }
我再次添加了带有日期的时间,并进行了以下代码更改
var comps = Calendar.current.dateComponents([.year, .month, .day], from: nextTriggerDate) comps.day = 25 comps.hour = 12 comps.minute = 17 comps.second = 10
这是COMPS变量的PO
Var coms=Calendar.Current.DateComponents([.年、.月、.日], 发件人:下一次触发日期) Comps.day=25 Comps.Hour=12 计算机分钟=17 Comps.Second=10
我只是给出了日期,看看它是否会启动,我只给出了日期和时间,看看它是否会启动,我在主线程中做了所有的事情,但它不工作
有人能让我明白我做错了什么吗
推荐答案
我已经检查了您的代码,很明显您正在正确添加日历触发器,并且您在其中一条评论中提到您在添加时也获得了必要的权限。
对我来说,这感觉像是约会时间的问题。检查DateTime到DateTime组件的对话是否正确进行。
如果您在模拟器上进行测试,当您来回更改系统中的日期时,事情可能会变得很疯狂。
我建议您使用真实设备进行测试。
这是您获得权限的方式
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.announcement,.sound]) { [self] (granted, error) in if granted { print("granted") } else { print("denied or error") } }
您可以使用以下代码查询可用通知列表,以确定是否在预期的日期时间正确安排了通知。
var text:N**utableAttributedString? = N**utableAttributedString(string: "List of notification requests and it's time ") UNUserNotificationCenter.current().getPendingNotificationRequests() { [weak self] requests in DispatchQueue.main.async { for request in requests { guard let trigger = request.trigger as? UNCalendarNotificationTrigger else { return } text?.append(NSAttributedString(string: " Trigger Date:(trigger.nextTriggerDate()?.description) DateTime Component:(trigger.dateComponents.description) ")) } print(text) }
更新(以下Credit(lorem ipsum)来自问题中的answer)
func getFireDatetime(apiDate: Date, numberOfDaysBeforeApiDate: Int,repeat:Bool) -> DateComponents? { if let fireDate: Date = apiDate.dateByAdding(days: -numberOfDaysBeforeApiDate) { if repeat { return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: fireDate) } return Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fireDate) } return nil }
调用getFireDatetime方法,我想这应该可以解决您的所有问题
P.S
date()它按世界时返回时间,而DateTime组件将使用您设备的当前日历设置提供DateTime。
当您使用DateTime组件时,应自动处理时区更改和夏令时