Wszyscy prawdopodobnie pojawili się, ale chciałbym podzielić się moim rozwiązaniem tego problemu. (Przepraszam za długie nazwy zmiennych ...)
Pomysł jest prosty: zawsze przechowuj fireDate w przyszłości.
-Co didFinishLaunchingWithOptions czasowych lub didReceiveLocalNotification wywoływana jest po prostu anulować bieżące powiadomienia i przełożyć nowy z fireDate jedną jednostkę interwału w przyszłości
-Gdy Twoje uruchamia app iterację wszystkich zaplanowanych zgłoszeń, jeżeli fireDate nie jest w przyszłości, wiesz, że zostało zignorowane:
W moim przypadku powiadomienia mają cotygodniowy okres powtarzania.I najpierw przełożyć żadnych potwierdzonych zgłoszeń didFinishLaunchingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UILocalNotification* localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif != nil)
{
[NotificationsHelper rescheduleNotification:localNotif];
}
}
a także w didReceiveLocalNotification:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *) notification
{
[NotificationsHelper rescheduleNotification:notification];
}
podczas uruchamiania aplikacji sprawdzić wszystkie powiadomienia dla któregokolwiek z fireDate w przeszłości:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self checkLocalNotifications:application];
}
Kod mojej funkcji "checkLocalNotifications":
- (void) checkLocalNotifications:(UIApplication *) application
{
UIApplication* app = [UIApplication sharedApplication];
NSArray* eventArray = [app scheduledLocalNotifications];
for (int i = 0; i < [eventArray count]; i++)
{
UILocalNotification* notification = [eventArray objectAtIndex:i];
if ([NotificationsHelper wasWeeklyRepeatingNotificationIgnored:notification])
{
[NotificationsHelper rescheduleNotification:notification];
NSLog(@"NotificationWasIgnored: %@ %@",notification.alertAction, notification.alertBody);
}
}
}
Kod dla mojej funkcji "wasWeeklyRepeatingNotificationIgnored":
+ (BOOL) wasWeeklyRepeatingNotificationIgnored:(UILocalNotification*) the_notification
{
BOOL result;
NSDate* now = [NSDate date];
// FireDate is earlier than now
if ([the_notification.fireDate compare:now] == NSOrderedAscending)
{
result = TRUE;
}
else
{
result = FALSE;
}
return result;
}
Kod dla mojej funkcji "rescheduleNotification":
+ (void) rescheduleNotification:(UILocalNotification*) the_notification
{
UILocalNotification* new_notification = [[UILocalNotification alloc] init];
NSMutableDictionary* userinfo = [[NSMutableDictionary alloc] init];
[new_notification setUserInfo:userinfo];
[new_notification setRepeatInterval:the_notification.repeatInterval];
[new_notification setSoundName:UILocalNotificationDefaultSoundName];
[new_notification setTimeZone:[NSTimeZone defaultTimeZone]];
[new_notification setAlertAction:the_notification.alertAction];
[new_notification setAlertBody:the_notification.alertBody];
[new_notification setRepeatCalendar:[NSCalendar currentCalendar]];
[new_notification setApplicationIconBadgeNumber:the_notification.applicationIconBadgeNumber];
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* weekdayComponents = [gregorian components:NSWeekdayCalendarUnit
fromDate:the_notification.fireDate];
NSInteger weekday = [weekdayComponents weekday];
NSDate* next_week = [self addDay:weekday toHourMinute:the_notification.fireDate];
[new_notification setFireDate:next_week];
[[UIApplication sharedApplication] scheduleLocalNotification:new_notification];
[[UIApplication sharedApplication] cancelLocalNotification:the_notification];
}
Jeżeli zgłoszenie jest * nie * w 'scheduleLocalNotifications', nie jest już zaplanowany, więc musiał zostać uruchomiony. – matt
"właśnie zredagowałem pytanie. Faktycznie miałem tam ten tekst, ale chciałem, aby rzeczy były tak proste, jak tylko mogłem (tj. Mniej tekstu). –
Mam wrażenie, że to, czego chcesz, nie istnieje, ale spowodowałoby to * wspaniałe * żądanie funkcji z Apple Reporterem błędów. – matt