To calculate the next fire date for a repeating UILocalNotification
, you have to:
- Figure out the amount of
repeatInterval
there's been between the notification's original fire date (i.e. its fireDate
property) and now.
- Add them to the notification's
fireDate
.
Here's one approach:
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *difference = [calendar components:notif.repeatInterval
fromDate:notif.fireDate
toDate:[NSDate date]
options:0];
NSDate *nextFireDate = [calendar dateByAddingComponents:difference
toDate:notif.fireDate
options:0];
This works in many scenarios, but here's a scenario where it won't work:
Suppose that:
- the notification's `fireDate is 01/01 at 2:00pm
- the notification's
repeatInterval
is NSDayCalendaryUnit
(i.e. repeat daily)
- The date now is 08/01 at 3:00pm
The above code will calculate the difference to 7 days (01/01 + 7 days = 08/01), add them to fireDate
, and thus set nextFireDate
to 08/01 at 2pm. But that's in the past, we want nextFireDate
to be 09/01 at 2pm!
So if using the above code and your repeatInterval
is NSDayCalendaryUnit
, then add these lines:
if ([nextFireDate timeIntervalSinceDate:[NSDate date]] < 0) {
//next fire date should be tomorrow!
NSDateComponents *extraDay = [[NSDateComponents alloc] init];
extraDay.day = 1;
nextFireDate = [calendar dateByAddingComponents:extraDay toDate:nextFireDate options:0];
}
I marked this answer as community wiki, feel free to edit it if you have found a better way to do the calculation!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…