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...
Author: Hermann Klecker, 2013-04-18

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.
 33
Author: Daniel Martín,
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++;
 6
Author: coppertop,
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:)

 4
Author: Archil Vardidze,
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.

Jeśli chcesz, aby znaczek został zwiększony, gdy aplikacja nie działa, należy ustawić numer odznaki w push notification payload . Powinieneś tam śledzić numer odznaki po stronie serwera, ponieważ właściwość 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.

 3
Author: rckoenes,
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
 0
Author: Michał Ziobro,
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