Номер значка приложения не увеличивается: 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