Zaktualizuj odznakę z powiadomieniem push, gdy aplikacja działa w tle

82

Mam działające powiadomienia push i udało mi się zaktualizować liczbę znaczków ikon, gdy aplikacja zostanie przeniesiona na pierwszy plan.

Jestem jednak trochę zdezorientowany ... iPhone otrzymuje powiadomienie, a wyskakujący komunikat wydaje się aktywować moją aplikację, a znaczek aktualizuje się dopiero po uruchomieniu aplikacji.

To nie brzmi dobrze z punktu widzenia doświadczenia użytkownika. Rozumiem, że liczba odznak powinna informować użytkownika o tym, co wymaga działania, poprzez zwiększoną liczbę, ale dzieje się to dopiero na późniejszym etapie, gdy aplikacja jest aktywna.

Czy jest więc sposób, aby nakazać aplikacji aktualizację liczby odznak, gdy otrzyma powiadomienia push i będąc w tle?

Zauważ, że moja aplikacja nie używa lokalizacji i że mam UIRemoteNotificationTypeBadgew zgłoszeniu prośbę o rejestrację.

Pozdrawiam AF

Abolfoooud
źródło
Czy chcesz wyświetlać plakietkę na ikonie aplikacji?
Aman Aggarwal,
Wyświetlam licznik na kartach. I w obliczu tego samego problemu. Gdy aplikacja działa w tle, liczba nie rośnie. Jak mogę ustawić?
Srusti Thakkar,

Odpowiedzi:

79

Ponieważ powiadomienia push są obsługiwane przez system iOS, a nie przez aplikację, nie można zmienić plakietki aplikacji po otrzymaniu powiadomienia push.

Ale możesz wysłać numer odznaki w ładunku powiadomienia wypychanego, ale będziesz musiał zrobić to po stronie serwera obliczeniowego.

Należy przeczytać Podręcznik programowania powiadomień lokalnych i wypychanych, a zwłaszcza Ładunek powiadomień .

Ładunek mógłby wyglądać następująco:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

Teraz ikona odznaki aplikacji pokaże 9.

rckoenes
źródło
4
Już to robię ... ale ta wartość jest pobierana tylko wtedy, gdy moja aplikacja jest przenoszona na pierwszy plan, którego później używam do aktualizowania wartości identyfikatora przy użyciu [UIApplication sharedApplication] .applicationIconBadgeNumber = count;
Abolfoooud,
7
Nie, musisz ustawić numer odznaki w ładunku powiadomienia push.
rckoenes
11
Po raz kolejny przyjrzałem się mojej strukturze ładunku i wygląda na to, że przekazałem wartość parametru badge jako ciąg „4” zamiast int 4 !!! Teraz mam to działa ... dzięki za pomoc
Abolfoooud
Przetestowałem, że nie działa, gdy zmienia się znaczek struktury ładunku
wod
1
@wod co masz na myśli mówiąc: zmiana znacznika struktury ładunku.
rckoenes
11

Możemy zmienić numer identyfikatora, gdy jesteśmy w stanie tła, wysyłając parametr "badge" w pakiecie powiadomień push. Jak zauważył @rckoenes, JSONparametr identyfikatora musi mieć wartość INTEGER .

Przykładowy kod PHP do tego samego

// Create the payload body
$body['aps'] = array(
        'alert' => $message,
        'badge' => 1,
        'sound' => 'default'
        );

badge => 1 gdzie 1 to liczba całkowita, a nie ciąg znaków (tj. bez apostrofów)

prajul
źródło
11

W rzeczywistości w iOS 10 zdalne powiadomienie wywoła automatycznie didReceiveRemoteNotificationmetodę w AppDelegate.

Masz dwa sposoby aktualizowania liczby odznak w tle.
Zrobiłem to również dla mojej obecnej aplikacji. Nie potrzebujesz też rozszerzenia usługi powiadomień.

1. sposób:

Wyślij klucz odznaki APS wraz z ładunkiem do APN.
Spowoduje to zaktualizowanie liczby odznak zgodnie z wartością całkowitą w ładunku odznaki. dawny:

// Payload for remote Notification to APN
{
    "aps": {
        "content-available": 1,
        "alert": "Hallo, this is a Test.",
        "badge": 2, // This is your Int which will appear as badge number,
        "sound": default
    }
}

Drugi sposób:

Możesz przełączyć plik application.applicationState i zaktualizować liczbę odznak, gdy stan applicationState jest w .background. ALE musisz uważać, aby nie ustawić parametru klucza identyfikatora w ładunku powiadomienia podczas wysyłania do APN ex

// Payload to APN as silent push notification
{
    "aps": {
        "content-available": 1
    }
}

Obsługuj aktualizację identyfikatora zgodnie ze stanem aplikacji:

Oto mój działający kod do aktualizacji liczby odznak bez klucza odznaki w ładunku dla APN.

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("APN recieved")
    // print(userInfo)
    
    let state = application.applicationState
    switch state {
        
    case .inactive:
        print("Inactive")
        
    case .background:
        print("Background")
        // update badge count here
        application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
        
    case .active:
        print("Active")

    }
}

Zresetuj liczbę odznak:

Nie zapomnij zresetować liczby odznak, gdy aplikacja wróci do stanu aktywnego.

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}
Gkiokan
źródło
Jak zaktualizować odznakę, jeśli aplikacja nie działa w tle?
Nagendra Rao
1
Jeśli wyślesz APS z kluczem dostępnym do zawartości, uruchomi metodę didReceiveRemoteNotification niezależnie od stanu aplikacji. Po prostu wypróbuj to z natywnym urządzeniem. Jeśli korzystasz z iOS, możesz użyć tego narzędzia do wysłania obiektu JSON do APN: github.com/noodlewerk/NWPusher
Gkiokan
wow, świetnie, a co jeśli wysyłam powiadomienie bez dostępnej treści? (co dotyczy powiadomień niezwiązanych z tłem). didReceiveRemoteNotificationnie jest nazywany
StackExploded
6
    **This is the APNS payload get back from server.**

    {
        "aps" : {
            "alert" : "You got your emails.",
            "badge" : 9,
            "sound" : "bingbong.aiff"
        },
        "acme1" : "bar",
        "acme2" : 42
    }

Wartość identyfikatora klucza jest automatycznie traktowana jako liczba identyfikatorów. Po stronie aplikacji na iOS nie ma potrzeby obliczania ani obsługi liczby. W powyższym przykładzie 9 to liczba odznak, więc ikona aplikacji pokaże 9.

UWAGA Gdy Twoja aplikacja jest blisko, nie możesz samodzielnie obsługiwać identyfikatorów, dlatego używamy klucza odznaki z pakietu APNS Payload Aby uzyskać lepsze wyjaśnienie dotyczące powiadomień, zapoznaj się z dokumentacją

jeśli chcesz samodzielnie zmniejszyć liczbę odznak, zmniejsz liczbę i zaktualizuj ją samodzielnie. jak poniżej

Prabhat Pandey
źródło
4

Jeśli używasz NotificationServiceExtension, możesz zaktualizować znaczek w tym.

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display

Za każdym razem, gdy aplikacja otrzyma powiadomienie, zostanie wywołane rozszerzenie usługi. Zapisz tę wartość jako domyślną użytkownika i wyświetl ją. Aby udostępniać ustawienia domyślne użytkownika między aplikacją a rozszerzeniem, musisz włączyć grupę aplikacji w aplikacji. Przeczytaj więcej tutaj

Surjeet Rajput
źródło
możesz zapisać liczbę powiadomień na serwerze i wysłać je z powiadomieniem.
Surjeet Rajput
Używam Firebase Cloud Messaging, czy wiesz, jak to zrobić?
Ghiggz Pikkoro
1

W przypadku Firebase Cloud Messaging (FCM) powinno wyglądać tak:

{
  "to": "some_token",

  "notification": {
    "body": "this is a body",
    "title": "this is a title",
    "badge" : 1
  }, 

  "priority": "high", 
}
Александр Бабич
źródło
0
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    application.applicationIconBadgeNumber = 0;
    NSLog(@"userInfo %@",userInfo);

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
    NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}
suvi
źródło
Dlaczego używasz intValue zamiast integerValue, który jest NSInteger? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone
0

Jak powiedział @rckoenes, będziesz musiał wykonać obliczenia po stronie serwera, ale skąd możesz wiedzieć, kiedy zwiększyć wartość numeru odznaki, którą powinieneś wysłać w ładunku?

Czy po uruchomieniu aplikacji wyśle ​​wiadomość na Twój serwer z informacją, że aplikacja została uruchomiona. Tak więc po stronie serwera zaczynasz ponownie od badge = 0 i gdy nie ma żadnych wiadomości otrzymanych przez serwer, zwiększaj numer identyfikatora z każdym ładunkiem powiadomienia push.

mustafa
źródło
0

w apns payload trzeba zdefiniować „content-available”: 1, aby zaktualizować liczbę znaczków w trybie tła

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {


// increase badge count, but no need if you include content-available

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

}

func applicationDidBecomeActive(_ application: UIApplication) {

// reset badge count

application.applicationIconBadgeNumber = 0

}

np.

"aps":{
    "alert":"Test",
    "sound":"default",
    "content-available":1

}
Prashant kumar
źródło
celem content-available = 1 jest ciche powiadomienie, a nie odznaki.
Manish
0

w starszym jego dziele, liczba zestawów „odznak”

{
  "to": "token",
  "notification": {
    "title": "Example",
    "body": "Tiene 22 actualizaciones.",
    "badge":278
  },
  "data": {
    "story_id": "story_12345",
    "count_vaca":22
  }
}
Javier J Solis Flores
źródło
-1

Po otrzymaniu zdalnego powiadomienia po otwarciu aplikacji,

pobierz aktualny numer odznaki w " didBecomeActive" metodzie twojego AppDelegate.

Plik używając poniższego kodu:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;
Ved Gupta
źródło
3
To nie zadziała, dopóki użytkownik nie dotknie aplikacji lub powiadomienia, aby uruchomić aplikację. Nie zrobi tego, czego chce OP, aby zaktualizować identyfikator, gdy aplikacja działa w tle i zanim użytkownik wejdzie w interakcję z aplikacją lub powiadomieniem.
Alex Zavatone