如何在每天的特定时间发送localNotification,即使该时间已经过去了?

时间:2015-08-05 00:02:20

标签: ios swift nsdate localnotification

我有这个代码每天早上7点运行一个通知,它获取当前日期,然后在达到设定小时时运行通知,我的问题是如果时间已经超过设定的运行时间那么每天它将会在用户当前时间运行而不是我早上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点之后,通知仍然会在第二天运行,我们将不胜感激

4 个答案:

答案 0 :(得分:7)

更新了@Paww11对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);

}

答案 1 :(得分:6)

Swift 5.1
例如,每天早上8:00触发一次:

let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Title"
notificationContent.body = "This is a test"
notificationContent.badge = NSNumber(value: 1)
notificationContent.sound = .default

var datComp = DateComponents()
datComp.hour = 8
datComp.minute = 0
let trigger = UNCalendarNotificationTrigger(dateMatching: datComp, repeats: true)
let request = UNNotificationRequest(identifier: "ID", content: notificationContent, trigger: trigger)
                UNCenter.add(request) { (error : Error?) in
                    if let theError = error {
                        print(theError as! String)
                    }
                }

答案 2 :(得分:4)

更新版本(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)

答案 3 :(得分:3)

您需要检查当前时间,如果时间超过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)