专家,任何帮助将不胜感激。
我在1月30日下午2:00设置了UILocalNotification,并且每月重复一次(localNotification.repeatInterval = NSCalendar.Unit.month
)。它在3月30日下午2点触发(所有这一切都很有效)。
但是在2月份,由于当月没有第30天,本地通知不会触发。
如果fireDate大于该月的最后一天,我是否有办法在该月的最后一天触发通知?
修改 以下是基于@MirekE建议的部分解决方案:
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
print("comparing fireDate to nextMonthLastDayDate..")
//get the fire date of the notification received
let notificationFireDate = notification.fireDate
//get the last day of the next month
let now = Date()
let calendar = Calendar.current
guard let days = calendar.range(of: .day, in: .month, for: now) else { preconditionFailure("Range of days can't be calculated") }
let lastDay = days.upperBound - 1
var lastDayComponents = calendar.dateComponents([.day, .month, .year], from: now)
lastDayComponents.day = lastDay
guard let lastDayDate = calendar.date(from: lastDayComponents) else { preconditionFailure("Date can't be calculated from components") }
let nextMonthLastDayDate = calendar.date(byAdding: .month, value: 1, to: lastDayDate)
//if the firedate is greater than the last day fo the next month...
if notificationFireDate! > nextMonthLastDayDate! {
//then set the firedate to the last day of the next month
notification.fireDate = nextMonthLastDayDate
print("did set fireDate = nextMonthLastDayDate : \(notification.fireDate)")
} else {
print("fireDate < nextMonthLastDayDate. fireDate not changed : \(notification.fireDate)")
}
}
现在,当收到最初设定为1月30日(并且每月重复一次)的通知时,它的新fireDate将更改为2月28日。
但是,它将在3月28日之后(而不是3月30日)开火。关于如何确保这一点的任何想法都会回来?
答案 0 :(得分:0)
根据您的目的,您可以考虑:
将当前日期表示为组件,然后将.day
替换为最后一天的值并转换回Date
和/或使用Calendar.date(from: DateComponents...)
let now = Date()
let calendar = Calendar.current
guard let days = calendar.range(of: .day, in: .month, for: now) else { preconditionFailure("Range of days can't be calculated") }
let lastDay = days.upperBound - 1
var lastDayComponents = calendar.dateComponents([.day, .month, .year], from: now)
lastDayComponents.day = lastDay
guard let lastDayDate = calendar.date(from: lastDayComponents) else { preconditionFailure("Date can't be calculated from components") }
let nextMonthLastDayDate = calendar.date(byAdding: .month, value: 1, to: lastDayDate)