How to set the time of Local notification in app to random between two times? (swift)

778 views Asked by At

How to set the time of Local notification in app to random between two times using swift?
For example between 8 a.m and 10 p.m
My code below for a specific time only ( in 12 a.m) but I don't know how can I put the time "random" between two times :

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var midnightSwitch: UISwitch!
    // you should declare your vars here
    let localNotificationDailyAt12am = UILocalNotification()
    // you should declare your funcions here
    // you have to register the user notifications settings options (badge, alert and sound if desired)
    func setUIUserNotificationOptions() {
        UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert, categories: nil))
    }
    // now lets setup your notification
    func notificationsOptions12am() {
        // defines localtime
        localNotificationDailyAt12am.timeZone = NSTimeZone.localTimeZone()
        // confirms the alert dialog box action
        localNotificationDailyAt12am.hasAction = true
        // defines the notification alert body text
        localNotificationDailyAt12am.alertBody = "The midnight notification message"
        // defines the daily time interval
        localNotificationDailyAt12am.repeatCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        localNotificationDailyAt12am.repeatInterval = .CalendarUnitDay
        // defines the notification alert button text
        localNotificationDailyAt12am.alertAction = "Open App"
        // defines the default sound for your notification
        localNotificationDailyAt12am.soundName = UILocalNotificationDefaultSoundName
        // increments the badge counter
        localNotificationDailyAt12am.applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
        // defines your firedate tomorrow at 12am ( note: extension NSDate tomorrowAt12am at the bottom )
        localNotificationDailyAt12am.fireDate = NSDate().tomorrowAt12am
        // lets set it up
        UIApplication.sharedApplication().scheduleLocalNotification(localNotificationDailyAt12am)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        setUIUserNotificationOptions()
        notificationsOptions12am()

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func switched(sender: AnyObject) {
        localNotificationDailyAt12am.fireDate = midnightSwitch.on ?
            NSDate().tomorrowAt12am :                                // tomorrow at 12am
                NSDate().dateByAddingTimeInterval(3155673600)        // will never fire (100 years from now)
    }
}
extension NSDate {
    var day:   Int { return NSCalendar.currentCalendar().components(.CalendarUnitDay,   fromDate: self).day   }
    var month: Int { return NSCalendar.currentCalendar().components(.CalendarUnitMonth, fromDate: self).month }
    var year:  Int { return NSCalendar.currentCalendar().components(.CalendarUnitYear,  fromDate: self).year  }
    var tomorrowAt12am: NSDate {
        return  NSCalendar.currentCalendar().dateWithEra(1, year: year, month: month, day: day+1, hour: 0, minute: 0, second: 0, nanosecond: 0)!
    }

thx : )

1

There are 1 answers

4
Logan On

You could use something like this:

extension NSDate {
    class func randomTimeBetweenDates(lhs: NSDate, _ rhs: NSDate) -> NSDate {
        let lhsInterval = lhs.timeIntervalSince1970
        let rhsInterval = rhs.timeIntervalSince1970
        let difference = fabs(rhsInterval - lhsInterval)
        let randomOffset = arc4random_uniform(UInt32(difference))
        let minimum = min(lhsInterval, rhsInterval)
        let randomInterval = minimum + NSTimeInterval(randomOffset)
        return NSDate(timeIntervalSince1970: randomInterval)
    }
}

Then, get your two dates:

let midnight = ...
let eightAm = ...
let random = NSDate.randomTimeBetweenDates(midnight, eightAm)