Хорошая модель для UILocalNotifications и applicationIconBadgeNumber

Мои графики приложений UILocalNotifications будут доставляться его пользователям в разное время выбора пользователя.

Я столкнулся с ситуацией с тем, как управлять параметром applicationIconBadgeNumber в этом сценарии.

Как известно, вы должны установить номер значка в момент создания уведомления. Моя проблема заключается в том, что состояние количества значков может измениться в любое время. Рассмотрим этот сценарий:

1) Пользователь получает 3 уведомления.

2) Пользователь создает новое уведомление, чтобы предупредить ее в определенный момент времени в будущем. Это уведомление несет значение 1 плюс текущее значение значка приложения (3).

3) Пользователь рассказывает о своей деятельности. В процессе своего бизнеса они очищают все 3 уведомления (и, следовательно, номера значков), которые они в настоящее время имеют, просматривая их или иным образом используя приложение.

4) По истечении заданного промежутка времени уведомление появляется в iOS вместе с его ранее вычисленным значением (4, если вы не помните).

5) Значок приложения теперь 4, даже если у пользователя есть только одно фактическое уведомление.

Я искал вверх и вниз, но я не могу найти ответ на этот вопрос, который почти наверняка имеет простой ответ, который я полностью отсутствует. Как решить эту проблему?

Ответ 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