Ответ 1
Так как ваше приложение не может смотреть в будущем и знать, какие события вы будете обрабатывать сразу, а какие из них вы оставите "ожидающим" на некоторое время, сделайте следующее:
Когда уведомления обрабатываются вашим приложением (нажав на уведомления, значок,...), вы должны:
- получить копию всех ожидающих уведомлений
- "изменить нумерацию номера значка этих ожидающих уведомлений"
- удалить все ожидающие уведомления
- перерегистрировать копию уведомлений с помощью исправленного значка цифры снова
Кроме того, когда ваше приложение регистрирует новое уведомление, оно должно проверить, сколько уведомлений ожидается в первую очередь, и зарегистрировать новое уведомление с помощью:
badgeNbr = nbrOfPendingNotifications + 1;
Посмотрев на мой код, он станет понятнее. Я тестировал это, и он определенно работает:
В вашем методе registerLocalNotification вы должны сделать следующее:
NSUInteger nextBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count] + 1;
localNotification.applicationIconBadgeNumber = nextBadgeNumber;
Когда вы обрабатываете уведомление (appDelegate), вы должны вызвать метод ниже, который очищает значок на значке и обновляет значки для ожидающих уведомлений (если они есть)
Обратите внимание, что следующий код отлично работает для "последовательных" зарегистрированных событий. Если вы добавите "события" между ожидающими, вам придется сначала "пересортировать" эти события. Я не зашел так далеко, но я думаю, что это возможно.
- (void)renumberBadgesOfPendingNotifications
{
// clear the badge on the icon
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
// first get a copy of all pending notifications (unfortunately you cannot 'modify' a pending notification)
NSArray *pendingNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
// if there are any pending notifications -> adjust their badge number
if (pendingNotifications.count != 0)
{
// clear all pending notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// the for loop will 'restore' the pending notifications, but with corrected badge numbers
// note : a more advanced method could 'sort' the notifications first !!!
NSUInteger badgeNbr = 1;
for (UILocalNotification *notification in pendingNotifications)
{
// modify the badgeNumber
notification.applicationIconBadgeNumber = badgeNbr++;
// schedule 'again'
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
}
Кредиты для @Whassaahh