iOS Daily Local Push Notifications

ios, nsdate, objective-c, uilocalnotification

Solution

You need to find the NEXT time that 9am occurs, and set the local notification to fire at that time:

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
[components setHour:9];
// Gives us today's date but at 9am
NSDate *next9am = [calendar dateFromComponents:components];
if ([next9am timeIntervalSinceNow] < 0) {
    // If today's 9am already occurred, add 24hours to get to tomorrow's
    next9am = [next9am dateByAddingTimeInterval:60*60*24];
}

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = next9am;
notification.alertBody = @"It's been 24 hours.";
// Set a repeat interval to daily
notification.repeatInterval = NSDayCalendarUnit;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Problem

I want to execute a `UILocalNotification` at 9:00 AM every day, forever, as long as the app is open. The closest thing I've found is this: ``` UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.fireDate = [[NSDate date] dateByAddingTimeInterval:60*60*24]; notification.alertBody = @"It's been 24 hours."; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; ``` However, this code only executes a `UILocalNotification` once in 24 hours, not at a specified time. I've been looking into utilizing `NSDate` somehow, but have been getting no where. The code will be executing in the `AppDelegate` in the `application didFinishLaunchingWithOptions` method. If someone were to open the application and place it in the background at 8:59 AM, the `UILocalNotification` would still execute at 9:00 AM. An `NSDateComponent` won't work with this because I would have to declare a year, month, and day, but I want to execute this `UILocalNotification` every day without having to edit the code.

Original source