检测将要触发的下一个UILocalNotification

时间:2014-01-04 21:25:47

标签: ios cocoa-touch nsarray uilocalnotification

有没有办法找到NSDate下一个要触发的本地通知?

例如,我设置了三个本地通知:

通知#1:设置为昨天下午3:00开始,每天重复一次。

通知#2:设置为今天下午5:00开始,每天重复一次。

通知#3:明天下午6点开始,每天重复一次。

鉴于当前是下午4:00,将触发的下一个本地通知是通知#2。

如何检索此本地通知并获取其日期?

我知道我可以在一个数组中检索这些本地通知,但是如何根据今天的日期获取下一个?#/ p>

1 个答案:

答案 0 :(得分:11)

您的任务的主要目标是确定给定后的“下一个开火日期” 每个通知的日期。 NSLog()的{​​{1}}输出显示了下一个开火日期, 但不幸的是,它似乎不是一个(公共)财产。

我从https://stackoverflow.com/a/18730449/1187415获取了代码(小编 改进)并将其重写为UILocalNotification的类别方法。 (这不完美。它不包括时区的情况 分配给通知。)

UILocalNotification

使用它,您可以根据需要对本地通知数组进行排序 下一个开火日期:

@interface UILocalNotification (MyNextFireDate)
- (NSDate *)myNextFireDateAfterDate:(NSDate *)afterDate;
@end

@implementation UILocalNotification (MyNextFireDate)
- (NSDate *)myNextFireDateAfterDate:(NSDate *)afterDate
{
    // Check if fire date is in the future:
    if ([self.fireDate compare:afterDate] == NSOrderedDescending)
        return self.fireDate;

    // The notification can have its own calendar, but the default is the current calendar:
    NSCalendar *cal = self.repeatCalendar;
    if (cal == nil)
        cal = [NSCalendar currentCalendar];

    // Number of repeat intervals between fire date and the reference date:
    NSDateComponents *difference = [cal components:self.repeatInterval
                                               fromDate:self.fireDate
                                                 toDate:afterDate
                                                options:0];

    // Add this number of repeat intervals to the initial fire date:
    NSDate *nextFireDate = [cal dateByAddingComponents:difference
                                                     toDate:self.fireDate
                                                    options:0];

    // If necessary, add one more:
    if ([nextFireDate compare:afterDate] == NSOrderedAscending) {
        switch (self.repeatInterval) {
            case NSDayCalendarUnit:
                difference.day++;
                break;
            case NSHourCalendarUnit:
                difference.hour++;
                break;
            // ... add cases for other repeat intervals ...
            default:
                break;
        }
        nextFireDate = [cal dateByAddingComponents:difference
                                            toDate:self.fireDate
                                           options:0];
    }
    return nextFireDate;
}
@end

现在NSArray *notifications = @[notif1, notif2, notif3]; NSDate *now = [NSDate date]; NSArray *sorted = [notifications sortedArrayUsingComparator:^NSComparisonResult(UILocalNotification *obj1, UILocalNotification *obj2) { NSDate *next1 = [obj1 myNextFireDateAfterDate:now]; NSDate *next2 = [obj2 myNextFireDateAfterDate:now]; return [next1 compare:next2]; }]; 将成为下一个触发的通知。