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 UIRemoteNotificationTypeBadge
w zgłoszeniu prośbę o rejestrację.
Pozdrawiam AF
źródło
Odpowiedzi:
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.
źródło
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,
JSON
parametr 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)źródło
W rzeczywistości w iOS 10 zdalne powiadomienie wywoła automatycznie
didReceiveRemoteNotification
metodę 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 }
źródło
didReceiveRemoteNotification
nie jest nazywany**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
źródło
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
źródło
Od iOS 10 możesz opracować rozszerzenie usługi powiadomień dla swojej aplikacji. Zostanie uruchomiony przez system po otrzymaniu powiadomienia i możesz obliczyć prawidłowy numer identyfikatora i ustawić go.
Zapoznaj się z dokumentacją: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
źródło
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
-(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]); }
źródło
@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_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.
źródło
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 }
źródło
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 } }
źródło
Po otrzymaniu zdalnego powiadomienia po otwarciu aplikacji,
pobierz aktualny numer odznaki w "
didBecomeActive
" metodzie twojegoAppDelegate
.Plik używając poniższego kodu:
int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber; badgeCount = badgeCount + 1;
źródło