Aktualisieren Sie das Abzeichen mit Push-Benachrichtigung, während die App im Hintergrund angezeigt wird

81

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 UIRemoteNotificationTypeBadgein der Benachrichtigungsregistrierungsanforderung habe.

Prost AF

Abolfoooud
quelle
Möchten Sie das Abzeichen auf dem App-Symbol anzeigen?
Aman Aggarwal
Ich zeige die Anzahl der Registerkarten an. Und vor dem gleichen Problem. Wenn sich die App im Hintergrund befindet, steigt die Anzahl nicht an. Wie kann ich einstellen?
Srusti Thakkar

Antworten:

78

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.

rckoenes
quelle
4
Ich mache das bereits ... aber dieser Wert wird nur abgerufen, wenn meine App in den Vordergrund gerückt wird. Mit diesem Wert aktualisiere ich später den Ausweiswert mithilfe von [UIApplication sharedApplication] .applicationIconBadgeNumber = count;
Abolfoooud
7
Nein, Sie müssen die Ausweisnummer in der Nutzlast der Push-Benachrichtigung festlegen.
rckoenes
11
Ich habe mir meine Nutzlaststruktur noch einmal angesehen und anscheinend habe ich den Wert des Badge-Parameters als Zeichenfolge '4' und nicht als int 4 übergeben !!! Jetzt habe ich es zum
Laufen gebracht
Getestet habe ich es nicht funktioniert , wenn eine Veränderung auf Abzeichen Nutzlaststruktur
wod
1
@wod was meinst du mit: Änderung am Payload Structure Badge.
rckoenes
11

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 JSONParameter 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)

Prajul
quelle
11

In iOS 10 ruft eine Remote-Benachrichtigung automatisch die didReceiveRemoteNotificationMethode 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
}
Gkiokan
quelle
Wie aktualisiere ich das Abzeichen, wenn die App nicht im Hintergrund ausgeführt wird?
Nagendra Rao
1
Wenn Sie den APS mit dem inhaltsverfügbaren Schlüssel senden, wird die didReceiveRemoteNotification-Methode unabhängig vom Status der App ausgeführt. Probieren Sie es einfach mit einem nativen Gerät aus. Wenn Sie mit iOS arbeiten, können Sie dieses Tool verwenden, um Ihr JSON-Objekt an APN zu senden: github.com/noodlewerk/NWPusher
Gkiokan
Wow, großartig, und was ist, wenn ich eine Benachrichtigung ohne verfügbaren Inhalt sende? (Dies ist eine Benachrichtigung ohne Hintergrund). didReceiveRemoteNotificationheißt nicht
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
    }

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

Prabhat Pandey
quelle
4

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

Surjeet Rajput
quelle
Sie können diese Benachrichtigungsanzahl auf dem Server speichern und mit Benachrichtigung senden.
Surjeet Rajput
Ich verwende Firebase Cloud Messaging. Wissen Sie, wie das geht?
Ghiggz Pikkoro
1

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
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
quelle
Warum verwenden Sie intValue anstelle von integerValue, einer NSInteger? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone
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.

mustafa
quelle
0

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

}
Prashant Kumar
quelle
Der Zweck von content-available = 1 ist die stille Benachrichtigung, nicht für das Abzeichen.
Manish
0

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
  }
}
Javier J Solis Flores
quelle
-1

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;
Ved Gupta
quelle
3
Dies funktioniert erst, wenn der Benutzer auf die App oder die Benachrichtigung zum Starten der App tippt. Es wird nicht das tun, was das OP will, um das Abzeichen zu aktualisieren, wenn sich die App im Hintergrund befindet und bevor der Benutzer mit der App oder der Benachrichtigung interagiert hat.
Alex Zavatone