2016-07-20 6 views
1

Ich bekomme derzeit Abzeichen von Nutzlast. Aber wie kann ich diesen Wert aktualisieren?Wie mache ich Badge inkrement auf iOS-Push-Benachrichtigung

{"aps": 
    {"alert":"Notification Hub test notification2", 
    "badge":1, 
    "sound":"Default"} 
} 

, wenn ich diese senden ist es immer zeigt 1 in der Ausweisnummer, aber wenn ich innerhalb app gehen und verlassen es wird updated.It aus diesem Grund ist,

func applicationDidBecomeActive(application: UIApplication) { 
     UIApplication.sharedApplication().applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1 
    } 

Aber wenn ich ein senden Neue Push-Benachrichtigung Es wird wieder 1 als Ausweisnummer im Icon angezeigt. Wie soll ich das tun, zu meinem Verständnis sollte ich aktualisierte Abzeichen senden, wenn ich die Nutzlast sende. Dafür muss ich mich mit Backend beschäftigen.

Gibt es einen anderen Vorschlag als diese in der App zu behandeln?

Antwort

-1

Sie gehen in eine richtige Richtung. Sie müssen die Ausweisnummer aus Ihrer Payload aktualisieren, und das ist der Standard in Push-Benachrichtigungen.

+2

Dies ist ein Kommentar, keine Antwort. – Droppy

+0

@Droppy Bitte überprüfen Sie in Frage, sie hat erwähnt, wie soll ich das tun und hat nach Anregungen gefragt. –

+0

Und Ihre "Antwort" liefert überhaupt keine Informationen. – Droppy

0

Wann immer wir die Push-Benachrichtigung verwenden. wir müssen seine Badge Anzahl aktualisieren. Ansonsten wird jedes Mal das gleiche Abzeichen sein. z.B. Wenn Sie eine Benachrichtigung erhalten haben, ist die Anzahl 1 und Sie lesen es. Es wird immer noch Badge 1 angezeigt. Dafür müssen Sie das Badge löschen. von Code wie folgt verwenden,

func applicationDidBecomeActive(application: UIApplication) { 
     application.applicationIconBadgeNumber = 0 
    } 
+0

Das ist Ziel C. Frage geht um swift – NSNoob

+0

Dennoch sollte es für jeden einfach sein, der jede Sprache kennt, um es zu übersetzen. Aber Sie sollten immer noch die schnelle Version dieser – NSNoob

0

Ihre Abzeichen Zählung in NSUserDefault halten für maximale Verfügbarkeit. Selbst wenn Sie Ihr Gerät neu starten, können Sie auch die Badge-Anzahl von NSUserDefault abrufen.

Wenn Sie eine weitere Nutzlast erhalten, können Sie die Anzahl der Plaketten in NSUserDefault erhöhen.

0

Als Erstes überlassen Sie es Ihren Serverleuten, Ihnen einen aktualisierten Plakettenzähler zu senden. Ihre Aufgabe ist es nur anzuzeigen, nicht um es an Ihrem Ende zu halten.

Sie müssen die Update-Operationen in applicationDidReceiveRemoteNotifications Delegate Methode wie folgt auszuführen:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]){ 
     let notification = userInfo["aps"] as? NSDictionary 
     let badge = (notification["badge"] as String).toInt() 
     UIApplication.sharedApplication().applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + badge; 

} 

Und in Ihrem DidBecomeActive Methode:

func applicationDidBecomeActive(application: UIApplication) { 
     if(UIApplication.sharedApplication().applicationIconBadgeNumber!=0){ 
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
    } 

Dies ist mit der Annahme, dass der Server, Push-Aktualisierung sendet Ausweiszähler. In , würde ich so etwas tun, um den Server zu übermitteln, die Zähler Push muss jetzt auf Null gesetzt werden:

var currentInstallation = PFInstallation.currentInstallation() 
     if currentInstallation.badge != 0 { 
     currentInstallation.badge = 0 
     currentInstallation.save 
     } 

Wenn ich dies nicht tun, werden Server, die Push-nehmen hat noch nie gelesen und wird den Plakettenzähler an ihrem Ende beim nächsten Stoß erhöhen usw.

0

Server muss viele Zähler in @"badge" Schlüssel erhöhen. Wenn Sie die App öffnen, müssen Sie eine Anfrage an den Server senden - Reset Push Counter (Badge). In applicationDidBecomeActive Methode.

{"aps": 
    {"alert":"Notification Hub test notification2", 
    "badge":20, 
    "sound":"Default"} 
} 
2

Ich werde meinen Weg zu Ihnen geben:

Mein Plan ist KVO zu verwenden, um die [UIApplication sharedApplication].applicationIconBadgeNumber

- (void)setupBadgeOperation { 
    [[UIApplication sharedApplication] addObserver:self forKeyPath:@"applicationIconBadgeNumber" options:NSKeyValueObservingOptionNew context:nil]; 
} 

zu hören Und sobald Wert geändert, verwende ich [[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil] die UI wo Bedürfnisse zu informieren für den Wechsel des Badges geändert werden.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"applicationIconBadgeNumber"]) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil]; 
    } 
} 

Es gibt drei Fall eine Remote-Benachrichtigung nach Eingang der [UIApplication sharedApplication].applicationIconBadgeNumber zu ändern.

a. App ist Vordergrund
b. App ist Hintergrund
c. App ist nicht

starten

in a und b Fall wird diese Methode aufgerufen werden:

- (void)application:(UIApplication *)application 
    didReceiveRemoteNotification:(NSDictionary *)userInfo 
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
    void(^tapBlock)(void(^completeHandler)()) = ^(void(^completeHandler)()) { 
    // here I remove some code not related with the question 
    NSNumber *badgeNumber = userInfo[@"aps"][@"badge"]; 
    [UIApplication sharedApplication].applicationIconBadgeNumber = badgeNumber.integerValue; 
} 

in c Fall gibt es keine Möglichkeit gibt, den Rückruf zu bekommen, so dass ich es manuell tun.

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil]; 
} 

Das ist alles und funktioniert gut für mich.

+0

hinzufügen. Wieder, Objective C! Die Frage dreht sich um Swift. – NSNoob

1

Hier ist meine Art und Weise Swift:

1) Sie benötigen Abzeichen setzen (eine Variable, die Sie kann es nennen, wie Sie wollen) auf Null in Firebase Realtime-Datenbank, wenn Sie die App starten. Plus-Set application.applicationIconBadgeNumber = 0. Hier ist, wie ich es in AppDelegate tun:

func applicationDidBecomeActive(_ application: UIApplication) { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    application.applicationIconBadgeNumber = 0 

    // Reset badge number to zero 
    let userID = Auth.auth().currentUser?.uid 

    let dbRef = Database.database().reference() 
    dbRef.child("Users Info").child(userID!).updateChildValues(["badge":"0"], withCompletionBlock: { (err, ref) in 
     if err != nil { 
      print(err!) 
      return 
     } 
    }) 

} 

2) Zum index.js wo eine Funktion ausgelöst wird.

... 
return admin.database().ref('/Users Info/' + owner).once('value', snapshot => { 

    var ownerValue = snapshot.val(); 

    var badgeNumber = parseInt(ownerValue.badge) + 1; 

    // Notification details. 
    const payload = { 
     notification: { 
     title: 'You have a new request!', 
     body: `A new request from ${downedBy.name}.`, 
     badge:`${badgeNumber}`, 
     sound: 'default', 
     } 
    }; 
    ... 
    ... 
    // Upload the new value of badge into Firebase to keep track of the number 
    return admin.database().ref('/Users Info/' + owner).update({badge:badgeNumber}); 
    ... 
    }) 
+0

sollte gewählt werden, es ist die perfekte Antwort, ich implementierte es genau so und es funktioniert gut! –