Passer au contenu principal
Les notifications en double se produisent lorsque le même appareil reçoit le même contenu de message plus d’une fois. Ce guide couvre les causes les plus courantes et comment les résoudre. Si le même utilisateur voit la notification sur plusieurs appareils (téléphone, tablette, ordinateur), il s’agit du comportement attendu en fonction de votre configuration de ciblage (segments, ID externes, etc.). Pour les messages in-app en double, consultez le guide de dépannage des messages in-app.
Apple a reconnu un bug dans iOS 17 qui provoquait des doublons. Cela a été corrigé dans iOS 17.3. En savoir plus.

Commencer ici

Choisissez la section qui correspond le mieux à votre situation :

Même message envoyé plusieurs fois

La cause la plus courante est l’envoi de la même charge utile de notification plus d’une fois via l’API OneSignal. Raisons courantes :
  • Votre serveur relance les requêtes sans vérifier si la première a réussi.
  • Une logique dupliquée dans votre pipeline backend envoie la même notification deux fois.
  • Vous migrez vers OneSignal mais envoyez toujours des notifications depuis un fournisseur précédent. Évitez d’envoyer depuis les deux systèmes en même temps.

Requêtes API idempotentes

Évitez les messages en double en réutilisant des clés d’idempotence lors des nouvelles tentatives.

Gestionnaires de notifications tiers

Des doublons peuvent se produire lorsque d’autre code dans votre application traite la charge utile push de OneSignal et affiche sa propre notification en plus de celle de OneSignal. Cela inclut :
  • D’autres SDK de push distant (par exemple, Firebase Cloud Messaging) qui reçoivent la même charge utile.
  • Des gestionnaires de messages personnalisés tels qu’un FirebaseMessagingService sur Android ou un UNUserNotificationCenterDelegate sur iOS qui lisent la charge utile entrante et construisent une notification locale à partir de celle-ci.
Le SDK OneSignal filtre automatiquement les charges utiles OneSignal lorsqu’il est le seul gestionnaire. Le code tiers ne sait pas les filtrer à moins que vous ne le lui indiquiez.

Identification des notifications OneSignal

Chaque notification OneSignal inclut un objet custom avec une clé i contenant l’UUID de la notification OneSignal :
JSON
{
  "custom": {
    "i": "the-notification-id"
  }
}
Pour la référence complète de la charge utile, consultez Structure de charge utile personnalisée OneSignal.

Filtrage des notifications OneSignal dans les gestionnaires tiers

Dans tout gestionnaire non-OneSignal, vérifiez la clé custom.i et retournez en avance lorsqu’elle est présente. OneSignal gère alors ses propres charges utiles tandis que votre autre code continue de traiter les siennes.
Dans un FirebaseMessagingService personnalisé ou un autre gestionnaire de messages distants :
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    val customJson = remoteMessage.data["custom"]
    if (customJson != null) {
        try {
            val custom = JSONObject(customJson)
            if (custom.has("i")) {
                // Notification OneSignal — laisser le SDK OneSignal la gérer
                return
            }
        } catch (e: JSONException) {
            // Pas une charge utile OneSignal, continuer
        }
    }

    // Gérer votre propre notification ici
}
Si vous contrôlez la structure de la charge utile envoyée par votre autre fournisseur, ajoutez une clé marqueur distincte (par exemple, my_app_notification: true) et filtrez dans les deux sens — gérez uniquement les notifications contenant votre marqueur dans votre propre code, et laissez OneSignal gérer les notifications contenant la clé custom.i.

Gestionnaires de notifications Android

OneSignal expose deux callbacks Android qui vous permettent d’intercepter et de personnaliser une notification avant qu’elle ne s’affiche : Des doublons se produisent lorsque ces callbacks affichent la notification en plus de l’affichage automatique de OneSignal.

La règle preventDefault() et display()

OneSignal affiche chaque notification automatiquement à moins que vous ne la supprimiez avec event.preventDefault(). Deux erreurs courantes provoquent des doublons :
  • Appeler event.getNotification().display() sans d’abord appeler event.preventDefault() — affiche la notification deux fois.
  • Publier une notification séparée avec NotificationManagerCompat.notify() tandis que OneSignal affiche également l’originale.
Un seul chemin d’affichage doit être actif — soit display() de OneSignal, soit votre propre NotificationManagerCompat.notify(), jamais les deux.
override fun onNotificationReceived(event: INotificationReceivedEvent) {
    event.preventDefault()

    val notification = event.notification
    notification.setExtender { builder ->
        builder.setColor(0xFF0000FF.toInt())
    }
    notification.display()
}
La même règle s’applique dans onWillDisplay dans un listener de cycle de vie en premier plan :
Kotlin
OneSignal.Notifications.addForegroundLifecycleListener(object : INotificationLifecycleListener {
    override fun onWillDisplay(event: INotificationWillDisplayEvent) {
        event.preventDefault()

        // Affichez votre propre interface ou appelez event.notification.display() pour afficher la notification OneSignal
    }
})
Si vous appelez preventDefault() mais n’appelez jamais display(), la notification est silencieusement abandonnée et l’utilisateur ne la voit pas. Chaque chemin de code doit soit appeler display() une fois, soit intentionnellement supprimer la notification.
Si vous utilisez à la fois une extension de service de notification et un listener de cycle de vie en premier plan, assurez-vous qu’un seul gestionnaire affiche la notification pour un état d’application donné. Appeler display() depuis les deux produit des doublons.

Travail asynchrone dans les callbacks

Lorsque vous effectuez un travail en arrière-plan (appels réseau, recherches en base de données) avant l’affichage, appelez preventDefault() de manière synchrone dans le callback et appelez display() uniquement après la fin du travail asynchrone. Retourner du callback sans preventDefault() permet à OneSignal d’afficher la notification, et un appel ultérieur à display() produit un doublon.

Gestionnaire en premier plan iOS

OneSignal se définit comme le UNUserNotificationCenterDelegate lors de l’initialisation du SDK. Si votre application implémente également la gestion des notifications en premier plan, la notification peut s’afficher deux fois — une fois depuis OneSignal et une fois depuis votre code. Schémas courants qui provoquent des doublons :
  • Implémenter votre propre UNUserNotificationCenterDelegate sans transférer les appels à OneSignal, puis appeler completionHandler([.banner, .sound]) et afficher une alerte in-app personnalisée depuis la même méthode.
  • Planifier une notification locale (UNUserNotificationCenter.current().add(...)) en réponse à un push entrant que OneSignal affiche également.
Pour contrôler l’affichage en premier plan sans provoquer de doublons, utilisez le listener de cycle de vie en premier plan de OneSignal et appelez event.preventDefault() lorsque vous souhaitez afficher la notification vous-même :
Swift
OneSignal.Notifications.addForegroundLifecycleListener(self)

func onWillDisplay(event: OSNotificationWillDisplayEvent) {
    event.preventDefault()

    // Affichez votre propre interface ou appelez event.notification.display() pour afficher la notification OneSignal
}

Plusieurs instances d’application

Des doublons peuvent se produire lorsque vous avez à la fois les versions de production et de développement de votre application installées. Chaque application a un nom de package unique et reçoit son propre jeton push.Appuyez longuement sur la notification pour confirmer quelle instance d’application l’a envoyée.

Conseils de diagnostic

Pour déboguer les doublons plus rapidement, collectez et envoyez les éléments suivants au support OneSignal :
  • ID d’abonnement OneSignal de l’appareil ayant reçu les doublons
  • ID du message OneSignal ou un lien vers le message dans le tableau de bord
  • Liste des autres bibliothèques ou plugins dans votre application
  • Journal de débogage reproduisant le problème
  • Étapes de reproduction détaillées

FAQ

Que se passe-t-il si j’ai deux SDK de notification dans mon application ?

Les deux SDK peuvent traiter et afficher indépendamment la même notification. OneSignal filtre ses propres notifications automatiquement, mais les autres SDK ne le font pas. Filtrez les charges utiles OneSignal des gestionnaires de votre autre SDK en vérifiant la clé custom.i. Consultez Gestionnaires de notifications tiers pour des exemples de code.

Comment envoyer des push depuis un fournisseur précédent et OneSignal en même temps ?

Vous pouvez faire la transition progressivement, mais évitez d’envoyer le même message depuis les deux fournisseurs.
  • Android : Supprimez l’ancien code de gestion des notifications du SDK lors de l’intégration de OneSignal et de la publication de l’application. Au fur et à mesure que les utilisateurs mettent à jour, ils cesseront de recevoir des push de l’ancien fournisseur.
  • iOS : Vous pouvez continuer à envoyer depuis l’ancien fournisseur temporairement pendant que les utilisateurs mettent à jour. Une fois la transition complète, envoyez uniquement depuis OneSignal pour éviter les doublons.

Comment éviter plusieurs notifications pour des mises à jour qui changent rapidement ?

Utilisez un collapse_id dans l’API Créer une notification pour remplacer les notifications précédentes plutôt que de les empiler. Lorsque plusieurs notifications partagent le même collapse_id, chaque nouvelle remplace la précédente dans la barre de notifications. Cela est utile pour les mises à jour de cours boursiers, les scores en direct, les ETA de livraison et les mises à jour fréquentes similaires.

Pages associées

Dépannage du SDK mobile

Résolvez les problèmes courants liés à la livraison des notifications push sur iOS et Android.

Dépannage du web push

Déboguez les problèmes d’abonnement, de service worker et de livraison du web push.

Dépannage des messages in-app

Corrigez les problèmes d’affichage, de déclencheurs et de doublons des messages in-app.

Extensions de service mobiles

Interceptez et personnalisez les notifications push avant l’affichage sur iOS et Android.

Notifications non affichées (web)

Résolvez les problèmes de notifications web push envoyées mais non affichées.