Чтобы вычислить следующую дату срабатывания для повторяющегося UILocalNotification
, вам необходимо:
- . Выяснить, сколько
repeatInterval
было между первоначальным срабатыванием уведомления.дата (т.е. свойство fireDate
) и сейчас. - Добавьте их к уведомлению
fireDate
.
Вот один подход:
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];
Этоработает во многих сценариях, но вот сценарий, в котором он не будет работать:
Предположим, что:
- fireDate уведомления 01/01 в 2:00 pm
- в уведомлении
repeatInterval
указано NSDayCalendaryUnit
(то есть повторяется ежедневно) - Дата теперь 08/01 в 15:00
Приведенный выше код рассчитает разницу до7 дней (01/01 + 7 дней = 08/01), добавьте их к fireDate
и, таким образом, установите nextFireDate
на 08/01 в 14:00 .Но это в прошлом, мы хотим, чтобы nextFireDate
было 09/01 в 14:00 !
Итак, если вы используете приведенный выше код и ваш repeatInterval
равен NSDayCalendaryUnit
, добавьте следующие строки:
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];
}
Я отметил этот ответ как вики сообщества, не стесняйтесь редактировать его, еслиВы нашли лучший способ сделать расчет!