Номер значка приложения не увеличивается: Xcode

Возникла проблема с обновлением значения номера значка приложения push-уведомлений.

Я делаю как:

-(void)application:(UIApplication *)application 
       didReceiveRemoteNotification:(NSDictionary *)userInfo {

       UIApplicationState state = [application applicationState];
       if (state == UIApplicationStateActive) {
          // do stuff when app is active

       }else{
          // do stuff when app is in background
          [UIApplication sharedApplication].applicationIconBadgeNumber = 
          [UIApplication sharedApplication].applicationIconBadgeNumber+1;  
               /* to increment icon badge number */
       }
 }

Но значок всегда показывает номер значка как "1", и он не увеличивается, когда появляется больше уведомлений / одно уведомление приходит за другим.

Любой совет заметен...

4 ответа

Решение

Номер значка устанавливается операционной системой, когда вы получаете полезную нагрузку уведомления JSON, которая выглядит следующим образом:

{
    "aps" : {
        "alert" : "New notification!",
        "badge" : 2
    }
}

Как видите, именно сервер отвечает за установку правильного номера в badge ключ. Ваш сервер должен отслеживать или вычислять количество ожидающих уведомлений для каждого пользователя и генерировать badge номер перед отправкой уведомления в Apple.

Клиент обязан очистить значок уведомления или уменьшить его, когда пользователь видит уведомление. Код для этого

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber - 1; // Decrement counter

или же

application.applicationIconBadgeNumber = 0; // Reset counter assuming the user is able to see all notifications at once.

Вместо этого вы можете создать статическую переменную и назначить ее для applicationIconBadgeNumber:

static int i=1;
[UIApplication sharedApplication].applicationIconBadgeNumber = i++;

У меня была такая же проблема и я решил ее, создав int. переменная в class.h

как это:

пользовательский класс. H

@property int badge;

пользовательский класс.M

-(id)init{

_badge=0;

self = [super init];
if (self) {

}
return self;}

-(void)reminderCreator:(NSDate*)onTime withText:(NSString*)text{

_badge += 1;

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = onTime;
localNotification.alertBody = text;
localNotification.soundName=UILocalNotificationDefaultSoundName;

localNotification.applicationIconBadgeNumber=_badge;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; }

поэтому, если вы инициализируете этот пользовательский класс где-то (возможно, в вашем viewController), а затем несколько раз вызываете метод remderCreator для настройки нескольких локальных уведомлений, он будет назначать увеличенный номер каждому уведомлению.

+1 если это помогло:)

-(void)application:didReceiveRemoteNotification: будет вызываться только тогда, когда ваше приложение работает на переднем плане.

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

Поскольку система обрабатывает входящие push-уведомления, ваше приложение не информируется о полученных push-уведомлениях для вашего приложения. Только когда ваше приложение работает на переднем плане, -(void)application:didReceiveRemoteNotification: называться. Невозможно заставить ваше приложение отреагировать на push-уведомление, когда оно не на переднем плане.

Да, похоже, что он всегда возвращает badgeNumber 1, хотя его значение увеличено до 2.

при использовании такого кода:

// update badge count
        let currentBadgeCount = UIApplication.shared.applicationIconBadgeNumber
        let badge = (aps["badge"] as? Int) ?? 1
        UIApplication.shared.applicationIconBadgeNumber = currentBadgeCount + badge

поэтому я думаю, что единственным решением будет сохранить его в UserDefaults, а затем обновить значение UserDafaults, а затем установить, а затем обновить количество значков?

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

static var notificationsCount: Int {
        set {
            let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
            userDefaults?.set(newValue, forKey: "notificationsCount")

            UIApplication.shared.applicationIconBadgeNumber = newValue
        }
        get {
            let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
            return userDefaults?.integer(forKey: "notificationsCount") ?? 0
        }
    }

А потом

SharedAppData.notificationsCount = 0 // сбросить счетчик значков

И это для увеличения

 // update badge count
        SharedAppData.notificationsCount += 1
Другие вопросы по тегам