Liczba znaczków ikony aplikacji nie rośnie: Xcode
Mam problem z aktualizacją wartości identyfikatora aplikacji push notification.
Robię tak:
-(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 */
}
}
Ale ikona zawsze pokazuje numer odznaki jako " 1 " i nie zwiększa się, gdy jest więcej powiadomień/ jedno powiadomienie przyszło po drugim.
Każda rada jest cenna...5 answers
Numer odznaki jest ustawiany przez system operacyjny, gdy otrzymasz ładunek powiadomienia JSON, który przypomina:
{
"aps" : {
"alert" : "New notification!",
"badge" : 2
}
}
Jak widzisz, to serwer jest odpowiedzialny za ustawienie poprawnej liczby w kluczu badge
. Serwer musi śledzić lub obliczać liczbę oczekujących powiadomień dla każdego użytkownika i wygenerować numer badge
przed wysłaniem powiadomienia do Apple.
Obowiązkiem klienta jest wyczyszczenie plakietki powiadomień lub jej dekretacja, gdy użytkownik widzi powiadomienie. Kod aby to zrobić to
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber - 1; // Decrement counter
Lub
application.applicationIconBadgeNumber = 0; // Reset counter assuming the user is able to see all notifications at once.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 07:46:10
Możesz zamiast tego utworzyć zmienną statyczną i przypisać ją do aplikacji:
static int i=1;
[UIApplication sharedApplication].applicationIconBadgeNumber = i++;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 02:33:33
Miałem ten sam problem i rozwiązałem go tworząc int. zmienna w klasie.h
Tak:
Klasa niestandardowa.H
@property int badge;
Klasa niestandardowa.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]; }
Więc jeśli zainicjujesz tę niestandardową klasę, gdzieś (może w twoim viewcontrollerze), a następnie wywołasz metodę reminderCreator kilka razy, aby ustawić kilka lokalnotifications, przypisze ona zwiększony numer do każdego powiadomienia.
+ 1 jeśli to pomogło:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-27 19:12:05
-(void)application:didReceiveRemoteNotification:
zostanie wywołana tylko wtedy, gdy aplikacja jest uruchomiona na pierwszym planie.
badge
ładunku powiadomienia push będzie używana jako numer odznaki. To Nie zwiększy numer odznaki dla Ciebie.
Ponieważ system obsługuje przychodzące powiadomienia push Twoja aplikacja nie jest informowana o otrzymanych powiadomieniach push dla Twojej aplikacji. Tylko wtedy, gdy aplikacja jest uruchomiona na pierwszym planie, zostanie wywołana -(void)application:didReceiveRemoteNotification:
. Nie ma sposobu, aby uzyskać aplikację do repsond do powiadomienia push, gdy nie ma go na pierwszym planie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 11:34:46
Tak wygląda na to, że zawsze zwraca badgeNumber 1, mimo że ma wartość zwiększoną do 2.
Przy użyciu takiego kodu:
// update badge count
let currentBadgeCount = UIApplication.shared.applicationIconBadgeNumber
let badge = (aps["badge"] as? Int) ?? 1
UIApplication.shared.applicationIconBadgeNumber = currentBadgeCount + badge
Więc myślę, że jedynym rozwiązaniem będzie zapisanie go w UserDefaults, a następnie zaktualizowanie wartości UserDafaults i wtedy zostanie ustawiona liczba znaczków aktualizacji?
To powinno zadziałać:
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
}
}
A następnie
SharedAppData.notificationsCount = 0
// aby zresetować liczbę odznak
And this to increment
// update badge count
SharedAppData.notificationsCount += 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-12 13:04:14