Swift:本地通知提前1小时排定

时间:2019-03-29 22:47:07

标签: swift while-loop notifications uilocalnotification

我试图在用户首次打开应用程序时安排一系列通知,所以我有以下代码,但是问题是他们安排在18:30而不是19:30进行安排。奇怪的是,如果我只调度一个通知而没有while循环,则数组的索引0为19:30,而其他索引则没有。有什么想法我做错了吗?

此外,如果这是一种非常愚蠢的方法,请告诉我。 我确实需要具体说明天数(所以从当前日期开始的第1、3、5、7、14 ...天)。谢谢。

let triggerDates = [
    // Notifications for the first week
    Calendar.current.date(byAdding: .day, value: 1, to: Date())!,
    Calendar.current.date(byAdding: .day, value: 3, to: Date())!,
    Calendar.current.date(byAdding: .day, value: 5, to: Date())!,
    Calendar.current.date(byAdding: .day, value: 7, to: Date())!,

    // Notifications for the month
    Calendar.current.date(byAdding: .day, value: 14, to: Date())!,
    Calendar.current.date(byAdding: .day, value: 21, to: Date())!,

    // Notifications afterward
    Calendar.current.date(byAdding: .day, value: 42, to: Date())!,
    Calendar.current.date(byAdding: .day, value: 84, to: Date())!]


var notificationToSchedule = 7

while notificationToSchedule >= 0 {
    var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: triggerDates[notificationToSchedule])

    dateComponents.hour = 19
    dateComponents.minute = 30
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
    let request = UNNotificationRequest(identifier: "notification\(notificationToSchedule)", content: content, trigger: trigger)
    center.add(request)
    print(trigger.nextTriggerDate() ?? "nil")

    notificationToSchedule -= 1
}

这是控制台使用以下代码输出的内容:

  

2019-06-21 18:30:00 +0000

     

2019-05-10 18:30:00 +0000

     

2019-04-19 18:30:00 +0000

     

2019-04-12 18:30:00 +0000

     

2019-04-05 18:30:00 +0000

     

2019-04-03 18:30:00 +0000

     

2019-04-01 18:30:00 +0000

     

2019-03-30 19:30:00 +0000

1 个答案:

答案 0 :(得分:2)

这与夏令时相关,因为它在31/03/2019上有所更改。另外,如果您设置了一个断点并检查triggerDates数组的内容,您将看到实际的日期,只是导致问题的控制台打印。

如果您在2019年3月30日在BST中添加1天,则由于夏令时,实际上您仅在UTC中添加23小时。但是,如果将其转换回去就可以了。