Ich habe eine Push-Benachrichtigung und konnte die Anzahl der Symbolabzeichen aktualisieren, wenn die App in den Vordergrund gestellt wird.
Ich bin allerdings etwas verwirrt darüber ... das iPhone erhält die Benachrichtigung und die Popup-Meldung wird angezeigt, um meine App zu aktivieren. Das Abzeichen wird erst aktualisiert, nachdem ich die App gestartet habe.
Dies klingt in Bezug auf die Benutzererfahrung nicht richtig. Meines Wissens nach sollte die Anzahl der Ausweise den Benutzer durch eine erhöhte Anzahl von Maßnahmen darüber informieren, was Maßnahmen erforderlich sind. Dies geschieht jedoch erst zu einem späteren Zeitpunkt, wenn die App live ist.
Gibt es also eine Möglichkeit, die App anzuweisen, die Anzahl der Ausweise zu aktualisieren, wenn sie Push-Benachrichtigungen erhält und sich im Hintergrund befindet?
Beachten Sie, dass meine App keinen Standort verwendet und dass ich UIRemoteNotificationTypeBadge
in der Benachrichtigungsregistrierungsanforderung habe.
Prost AF
quelle
Antworten:
Da Push-Benachrichtigungen von iOS und nicht von Ihrer App verarbeitet werden, können Sie das Anwendungsabzeichen beim Empfang einer Push-Benachrichtigung nicht ändern.
Sie können die Ausweisnummer jedoch in der Nutzlast der Push-Benachrichtigung senden, müssen dies jedoch auf der Seite des Berechnungsservers tun.
Sie sollten das Programmierhandbuch für lokale und Push-Benachrichtigungen und insbesondere das The Notification Payload lesen .
Die Nutzlast könnte folgendermaßen aussehen:
{ "aps" : { "alert" : "You got your emails.", "badge" : 9 } }
Jetzt zeigt das App-Anwendungs-Badge-Symbol 9 an.
quelle
Wir können die Ausweisnummer ändern, wenn wir uns im Hintergrund befinden, indem wir den Parameter "Ausweis" im Push-Benachrichtigungspaket senden . Wie @rckoenes hervorhob, muss der
JSON
Parameter für das Abzeichen ein INTEGER sein .Beispiel-PHP-Code, um dasselbe zu tun
// Create the payload body $body['aps'] = array( 'alert' => $message, 'badge' => 1, 'sound' => 'default' );
badge => 1
wobei 1 eine ganze Zahl ist, keine Zeichenfolge (dh ohne Apostrophe)quelle
In iOS 10 ruft eine Remote-Benachrichtigung automatisch die
didReceiveRemoteNotification
Methode in Ihrem AppDelegate auf.Sie haben zwei Möglichkeiten, die Anzahl der Ausweise im Hintergrund zu aktualisieren.
Ich habe dies auch für meine aktuelle App getan. Sie benötigen auch keine Benachrichtigungsdiensterweiterung.
1. Weg:
Senden Sie den APS-Ausweisschlüssel mit Ihrer Nutzlast an APN.
Dadurch wird die Anzahl der Ausweise entsprechend Ihrem Integer-Wert in Ihrer Nutzlast des Ausweises aktualisiert. Ex:
// 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 } }
2. Weg:
Sie können Ihren application.applicationState wechseln und die Anzahl Ihrer Ausweise aktualisieren, wenn sich der applicationState befindet
.background
. ABER Sie müssen darauf achten, den Badge-Schlüsselparameter in Ihrer Benachrichtigungsnutzlast nicht zu setzen, wenn Sie an APN ex senden// Payload to APN as silent push notification { "aps": { "content-available": 1 } }
Behandeln Sie das Badge-Update entsprechend dem Anwendungsstatus:
Hier ist mein Arbeitscode für die Aktualisierung der Ausweisanzahl ohne Ausweisschlüssel in der Nutzlast für 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") } }
Anzahl der Ausweise zurücksetzen:
Vergessen Sie nicht, die Anzahl Ihrer Ausweise zurückzusetzen, wenn Ihre App wieder aktiv ist.
func applicationDidBecomeActive(_ application: UIApplication) { // reset badge count application.applicationIconBadgeNumber = 0 }
quelle
didReceiveRemoteNotification
heißt nicht**This is the APNS payload get back from server.** { "aps" : { "alert" : "You got your emails.", "badge" : 9, "sound" : "bingbong.aiff" }, "acme1" : "bar", "acme2" : 42 }
Der Wert für das Schlüsselabzeichen wird automatisch als Abzeichenanzahl betrachtet. Auf der App-Seite ist es nicht erforderlich, die Anzahl zu berechnen oder zu verarbeiten. Im obigen Beispiel ist 9 die Anzahl der Ausweise. Ihr App-Symbol zeigt also 9 an.
HINWEIS Während Ihre App geschlossen ist, können Sie Ausweise nicht alleine verarbeiten. Deshalb verwenden wir den Ausweisschlüssel von APNS Payload. Weitere Informationen zur Benachrichtigung finden Sie in der Dokumentation
Wenn Sie die Anzahl der Ausweise selbst reduzieren möchten. Verringern Sie die Anzahl und aktualisieren Sie sie selbst
quelle
Wenn Sie NotificationServiceExtension verwenden, können Sie das Badge darin aktualisieren.
var bestAttemptContent : UNMutableNotificationContent? // bestAttemptContent.badge = 0//any no you wanna display
Jedes Mal, wenn Ihre Anwendung eine Benachrichtigung erhält, wird Ihre Serviceerweiterung aufgerufen. Speichern Sie diesen Wert in der Standardeinstellung des Benutzers und zeigen Sie ihn an. Um Benutzerstandards zwischen Anwendung und Erweiterung zu teilen, müssen Sie die App-Gruppe in der Anwendung aktivieren. Lesen Sie hier mehr
quelle
Seit iOS 10 können Sie eine Benachrichtigungsdienst-Erweiterung für Ihre App entwickeln. Es wird vom System gestartet, wenn Sie eine Benachrichtigung erhalten, und Sie können eine gültige Nummer für den Ausweis berechnen und festlegen.
Schauen Sie sich die Dokumentation an: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
quelle
Für Firebase Cloud Messaging (FCM) sollte dies folgendermaßen aussehen:
{ "to": "some_token", "notification": { "body": "this is a body", "title": "this is a title", "badge" : 1 }, "priority": "high", }
quelle
-(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]); }
quelle
@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Wie @rckoenes sagte, müssen Sie die Seite des Berechnungsservers ausführen, aber wie können Sie wissen, wann Sie den Wert der Ausweisnummer erhöhen müssen, den Sie in der Nutzlast senden sollten?.
Wird beim Starten der Anwendung eine Nachricht an Ihren Server gesendet, die angibt, dass die Anwendung gestartet wurde. Auf der Serverseite starten Sie also erneut mit Badge = 0, und solange keine Nachrichten vom Server empfangen werden, erhöhen Sie die Badge-Nummer mit jeder Nutzlast für Push-Benachrichtigungen.
quelle
in apns muss payload "content-available" definieren: 1 für die Anzahl der Update-Badges im Hintergrundmodus
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 }
für zB.
"aps":{ "alert":"Test", "sound":"default", "content-available":1 }
quelle
im Erbe seiner Arbeit, "Abzeichen" gesetzt Anzahl
{ "to": "token", "notification": { "title": "Example", "body": "Tiene 22 actualizaciones.", "badge":278 }, "data": { "story_id": "story_12345", "count_vaca":22 } }
quelle
Nach Erhalt der Remote-Benachrichtigung beim Öffnen der App
Holen Sie sich die aktuelle Ausweisnummer in "
didBecomeActive
" Methode IhrerAppDelegate
.Datei mit folgendem Code:
int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber; badgeCount = badgeCount + 1;
quelle