96 votes

Mise à jour du badge avec une notification push lorsque l'application est en arrière-plan

J'ai réussi à faire fonctionner la notification push et à mettre à jour le nombre de badges d'icônes lorsque l'application passe au premier plan.

Je suis un peu confus à ce sujet cependant... l'iPhone reçoit la notification et le message pop up apparaît pour activer mon application, et le badge ne se met à jour qu'après que j'ai lancé l'application.

Cela ne semble pas correct en termes d'expérience utilisateur. D'après ce que j'ai compris, le nombre de badges devrait avertir l'utilisateur de ce qui doit être fait, grâce à l'incrémentation du nombre, mais cela ne se produit qu'à un stade ultérieur, lorsque l'application est en ligne.

Y a-t-il un moyen de dire à l'application de mettre à jour le nombre de badges lorsqu'elle reçoit des notifications push et lorsqu'elle est en arrière-plan ?

Notez que mon application n'utilise pas la localisation et que j'ai UIRemoteNotificationTypeBadge dans la demande d'enregistrement de la notification.

94voto

rckoenes Points 44278

Comme les notifications push sont gérées par iOS et non par votre application, vous ne pouvez pas modifier le badge de l'application lors de la réception d'une notification push.

Mais vous pouvez envoyer le numéro de badge dans la charge utile de la notification push, mais vous devrez faire le calcul côté serveur.

Vous devriez lire Guide de programmation des notifications locales et des notifications push et surtout le Les données utiles de la notification .

La charge utile pourrait ressembler à ça :

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

Maintenant, l'icône du badge de l'application s'affiche 9.

24voto

Gkiokan Points 697

En fait, dans iOS 10, une notification à distance appelle automatiquement. didReceiveRemoteNotification dans votre AppDelegate.

Vous avez deux façons de mettre à jour le nombre de badges en arrière-plan.
Je l'ai fait aussi pour mon application actuelle. Vous n'avez pas besoin non plus d'une Notification Service Extension.

1ère voie :

Envoyez la clé de badge APS avec votre charge utile à APN.
Cela mettra à jour le nombre de badges en fonction de la valeur de votre Integer dans votre payload de badge. e.x. :

// 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ème voie :

Vous pouvez changer votre application.applicationState et mettre à jour vos badges Compter quand l'applicationState est en .background . MAIS vous devez faire attention à ne pas définir le paramètre de la clé de badge dans votre charge utile de notification lors de l'envoi à APN e.x.

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

Traitez la mise à jour du badge en fonction de l'état de l'application :

Voici mon code de travail pour la mise à jour du nombre de badges sans clé de badge dans la charge utile pour 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")

    }
}

Remise à zéro du nombre de badges :

N'oubliez pas de réinitialiser le nombre de badges lorsque votre application revient à l'état actif.

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}

11voto

prajul Points 508

Nous pouvons modifier le numéro de badge lorsque nous sommes en arrière-plan en envoyant la commande "badge" dans le paquet de notification push. Comme @rckoenes l'a souligné, le JSON pour le badge doit être un INTEGER .

Exemple de code PHP pour faire la même chose

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

badge => 1 où 1 est un nombre entier et non une chaîne de caractères (c'est-à-dire sans apostrophes)

7voto

Prabhat Pandey Points 237
    **This is the APNS payload get back from server.**

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

La valeur de la clé du badge est automatiquement considérée comme le nombre de badges et il n'est pas nécessaire de calculer ou de gérer le nombre de badges du côté de l'application ios. Dans l'exemple ci-dessus, 9 est le nombre de badges, l'icône de votre application affichera donc 9.

NOTE : Tant que votre application est fermée, vous ne pouvez pas gérer les badges par vous-même, c'est pourquoi nous utilisons la clé de badge de APNS Payload. Pour plus d'informations sur les notifications, consultez la documentation

si vous voulez réduire le nombre de badges par vous-même, réduisez le nombre de badges et mettez-le à jour vous-même, comme suit

6voto

commando24 Points 493

Si vous utilisez NotificationServiceExtension, vous pouvez mettre à jour le badge dans cette extension.

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

Chaque fois que votre application reçoit une notification, votre service d'extension est appelé, ce qui permet d'enregistrer cette valeur dans les paramètres par défaut de l'utilisateur et de l'afficher. Pour partager les valeurs par défaut de l'utilisateur entre l'application et l'extension, vous devez activer le groupe d'applications dans l'application. Plus d'informations ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X