How to send a localNotification at a specific time everyday, even if that time has passed?

前端 未结 4 1999
执笔经年
执笔经年 2020-12-17 06:33

I have this code which runs a notification everyday at 7am, it gets the current date and then runs the notification when it gets to the set hour, my problem is if the time h

相关标签:
4条回答
  • 2020-12-17 06:54

    Swift 5.1
    This one for example fires every day at 8:00 A.M. :

    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)
                        }
                    }
    
    0 讨论(0)
  • 2020-12-17 07:01

    You need to check the current hour and if it is later than 6:59 you need to schedule your notification for tomorrow - this will prevent your notification from being scheduled in the past -

    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)
    
    0 讨论(0)
  • 2020-12-17 07:05

    Updated version (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)
    
    0 讨论(0)
  • 2020-12-17 07:12

    Updated @Paulw11 's answer to Swift 3.0 and wrapped up in a function:

    /// 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);
    
    }
    
    0 讨论(0)
提交回复
热议问题