如何在每天的特定时间发送本地通知,即使时间已过?

我有这个代码每天早上7点运行一个通知,它获取当前的date,然后运行通知,当它达到设定的小时,我的问题是如果时间已经超过了设定的运行时间,那么每天它将运行在用户当前时间不是我上午7点的时间,这里是我的代码

var dateFire: NSDateComponents = NSDateComponents() var getCurrentYear = dateFire.year var getCurrentMonth = dateFire.month var getCurrentDay = dateFire.day dateFire.year = getCurrentYear dateFire.month = getCurrentMonth dateFire.day = getCurrentDay dateFire.hour = 7 dateFire.minute = 0 dateFire.timeZone = NSTimeZone.defaultTimeZone() var calender: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! var date: NSDate = calender.dateFromComponents(dateFire)! var localNotification = UILocalNotification() localNotification.fireDate = date localNotification.alertBody = "A new day has begun and a fresh layer on snow lies on the mountain! Can you beat your highscore?" localNotification.repeatInterval = NSCalendarUnit.CalendarUnitDay UIApplication.sharedApplication().scheduleLocalNotification(localNotification) 

正如你可以看到NSCalendarUnit.CaldendarUnitDay使它每天早上7点运行。 我不知道,所以即使是7点以后的时间,通知仍然会在第二天运行,将不胜感激

更新@ Paulw11对Swift 3.0的回答,并包装在一个函数中:

 /// Set up the local notification for everyday /// - parameter hour: The hour in 24 of the day to trigger the notification class func setUpLocalNotification(hour: Int, minute: Int) { // have to use NSCalendar for the components let calendar = NSCalendar(identifier: .gregorian)!; var dateFire = Date() // if today's date is passed, use tomorrow var fireComponents = calendar.components( [NSCalendar.Unit.day, NSCalendar.Unit.month, NSCalendar.Unit.year, NSCalendar.Unit.hour, NSCalendar.Unit.minute], from:dateFire) if (fireComponents.hour! > hour || (fireComponents.hour == hour && fireComponents.minute! >= minute) ) { dateFire = dateFire.addingTimeInterval(86400) // Use tomorrow's date fireComponents = calendar.components( [NSCalendar.Unit.day, NSCalendar.Unit.month, NSCalendar.Unit.year, NSCalendar.Unit.hour, NSCalendar.Unit.minute], from:dateFire); } // set up the time fireComponents.hour = hour fireComponents.minute = minute // schedule local notification dateFire = calendar.date(from: fireComponents)! let localNotification = UILocalNotification() localNotification.fireDate = dateFire localNotification.alertBody = "Record Today Numerily. Be completely honest: how is your day so far?" localNotification.repeatInterval = NSCalendar.Unit.day localNotification.soundName = UILocalNotificationDefaultSoundName; UIApplication.shared.scheduleLocalNotification(localNotification); } 

更新的版本(Swift 2.0)

  let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! var dateFire=NSDate() var fireComponents=calendar.components([.Month, .Day, .Hour, .Minute], fromDate:NSDate()) if (fireComponents.hour == 7) { dateFire=dateFire.dateByAddingTimeInterval(86400) // Use tomorrow's date fireComponents=calendar.components([.Month, .Day, .Hour, .Minute], fromDate:NSDate()) } fireComponents.hour = 7 fireComponents.minute = 0 dateFire = calendar.dateFromComponents(fireComponents)! let localNotification = UILocalNotification() localNotification.fireDate = dateFire localNotification.alertBody = "Don't forget to visit Quote Daily to receive daily motivation." localNotification.repeatInterval = NSCalendarUnit.Day UIApplication.sharedApplication().scheduleLocalNotification(localNotification) 

您需要检查当前时间,如果晚于6:59,您需要安排明天的通知 – 这将阻止您的通知被安排在过去 –

 var calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! var dateFire=NSDate() var fireComponents=calendar.components(NSCalendarUnit.CalendarUnitDay|NSCalendarUnit.CalendarUnitMonth|NSCalendarUnit.CalendarUnitYear|NSCalendarUnit.CalendarUnitHour|NSCalendarUnit.CalendarUnitMinute, fromDate:dateFire) if (fireComponents.hour >= 7) { dateFire=dateFire.dateByAddingTimeInterval(86400) // Use tomorrow's date fireComponents=calendar.components(NSCalendarUnit.CalendarUnitDay|NSCalendarUnit.CalendarUnitMonth|NSCalendarUnit.CalendarUnitYear|NSCalendarUnit.CalendarUnitHour|NSCalendarUnit.CalendarUnitMinute, fromDate:dateFire) } fireComponents.hour = 7 fireComponents.minute = 0 dateFire = calendar.dateFromComponents(fireComponents)! var localNotification = UILocalNotification() localNotification.fireDate = dateFire localNotification.alertBody = "A new day has begun and a fresh layer on snow lies on the mountain! Can you beat your highscore?" localNotification.repeatInterval = NSCalendarUnit.CalendarUnitDay UIApplication.sharedApplication().scheduleLocalNotification(localNotification)