Как увеличить номер значка приложения для повторяющихся локальных уведомлений (iPhone) - PullRequest
7 голосов
/ 12 февраля 2012

Я настроил локальное уведомление, которое повторяется каждую минуту, однако мне нужно, чтобы номер значка приложения увеличивался каждый раз. Когда я запускаю его в данный момент, он, кажется, не увеличивается, а просто остается равным 1. Пожалуйста, кто-нибудь может мне помочь?

Вот как я создаю уведомления:

// Create the UILocalNotification
UILocalNotification *myNotification = [[UILocalNotification alloc] init];
myNotification.alertBody = @"Blah blah blah...";
myNotification.alertAction = @"Blah";
myNotification.soundName = UILocalNotificationDefaultSoundName;
myNotification.applicationIconBadgeNumber++;
myNotification.timeZone = [NSTimeZone defaultTimeZone];
myNotification.repeatInterval = NSMinuteCalendarUnit;
myNotification.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
[[UIApplication sharedApplication] scheduleLocalNotification:myNotification];

Ответы [ 7 ]

21 голосов
/ 11 мая 2012

После многих исследований я понял, что решение не существует:

iPhone: увеличение значка приложения через локальное уведомление

Невозможно динамически обновлять номер значка с помощью локальных уведомлений, пока ваше приложение находится в фоновом режиме. Вы должны использовать push-уведомления.

1 голос
/ 18 ноября 2015

Если вы используете стороннюю службу, такую ​​как Parse for Push, это легко сделать. Просто увеличивайте номер значка парсинга при запуске локального уведомления. Хотя это особый случай.

0 голосов
/ 21 июня 2016

Я смог сделать это, используя следующую строку при планировании локального уведомления

localNotification.applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + 1;

и на другом конце в приложении applelegate

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

    application.applicationIconBadgeNumber -= 1;
}
0 голосов
/ 15 июня 2016

Попробуй это ... у меня получилось по простому сценарию ...

notification.applicationIconBadgeNumber = [UIApplication sharedApplication].scheduledLocalNotifications.count + 1;

И не забудьте установить значок значка обратно на 0 при запуске приложения.

0 голосов
/ 05 октября 2015

Хотя не существует простого applicationIconBadgeNumber++ метода, как упомянул BFar, вы можете достичь того, о чем вы просите, обновляя все запланированные значения applicationIconBadgeNumbers UILocalNotifications при каждом добавлении или удалении уведомления.

Хотя это не будет работать, если у вас есть уведомления, которые используют repeatInterval, , если вы звоните scheduleNotification и decrementBadgeNumber в нужное время, класс ниже должен сделать свое дело.

@implementation NotificationScheduler

+ (void) scheduleNotification:(NSString*)message date:(NSDate*)date {
    UIApplication *app = [UIApplication sharedApplication];
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    if (notification) {
        notification.fireDate = date;
        notification.timeZone = [NSTimeZone defaultTimeZone];

        notification.alertBody = message;
        notification.soundName = UILocalNotificationDefaultSoundName;
        notification.applicationIconBadgeNumber = [self getExpectedApplicationIconBadgeNumber:date];

        [app scheduleLocalNotification:notification];
        [self updateBadgeCountsForQueuedNotifiations];
    }
}

+ (void) decrementBadgeNumber:(long)amount {
    [self setCurrentBadgeNumber:([self getCurrentBadgeNumber] - amount)];
    [self updateBadgeCountsForQueuedNotifiations];
}

+ (long) getExpectedApplicationIconBadgeNumber:(NSDate*)notificationDate {
    long number = [self getCurrentBadgeNumber];
    for (UILocalNotification *notice in [self getScheduledLocalNotifications]) {
        if (notice.fireDate <= notificationDate) {
            number++;
        }
    }
    return number;
}

+ (void) updateBadgeCountsForScheduledNotifiations {
    long expectedBadgeNumber = [self getCurrentBadgeNumber];
    NSArray *allLocalNotifications = [self getScheduledLocalNotifications];
    for (UILocalNotification *notice in allLocalNotifications) {
        expectedBadgeNumber++;
        notice.applicationIconBadgeNumber = expectedBadgeNumber;
    }
    [[UIApplication sharedApplication] setScheduledLocalNotifications:allLocalNotifications];
}

+ (long) getCurrentBadgeNumber {
    return [UIApplication sharedApplication].applicationIconBadgeNumber;
}

+ (void) setCurrentBadgeNumber:(long)number {
    [UIApplication sharedApplication].applicationIconBadgeNumber = number;
}

+ (NSArray*) getScheduledLocalNotifications {
    NSSortDescriptor * fireDateDesc = [NSSortDescriptor sortDescriptorWithKey:@"fireDate" ascending:YES];
    return [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingDescriptors:@[fireDateDesc]];
}

@end
0 голосов
/ 18 марта 2012

Это должно работать.

myNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
0 голосов
/ 12 февраля 2012

Попробуйте что-то вроде:

int plusOne = [myNotification.applicationIconBadgeNumber intValue];
plusOne++;

myNotification.applicationIconBadgeNumber = plusOne;
...