Apple reconoció un error en iOS 17 que causaba duplicados. Esto se corrigió en iOS 17.3. Leer más.
Comience aquí
Seleccione la sección que mejor se ajuste a su situación:- Su servidor reintenta llamadas API fallidas o su pipeline de backend puede enviar duplicados → El mismo mensaje enviado varias veces
- Su aplicación usa Firebase u otro SDK de push junto con OneSignal → Manejadores de notificaciones de terceros
- Su aplicación Android personaliza notificaciones en código (extensión de servicio o listener en primer plano) → Manejadores de notificaciones Android
- Su aplicación iOS implementa su propio
UNUserNotificationCenterDelegate→ Manejador en primer plano de iOS - Solo ve duplicados en compilaciones de desarrollo o con múltiples instalaciones → Múltiples instancias de aplicación
El mismo mensaje enviado varias veces
La causa más común es enviar la misma carga útil de notificación más de una vez a través de la API de OneSignal. Razones comunes:- Su servidor reintenta solicitudes sin verificar si la primera tuvo éxito.
- Duplicación de lógica en su pipeline de backend que envía la misma notificación dos veces.
- Está migrando a OneSignal pero todavía envía notificaciones desde un proveedor anterior. Evite enviar desde ambos sistemas al mismo tiempo.
Solicitudes de API idempotentes
Evite mensajes duplicados reutilizando claves de idempotencia en los reintentos.
Manejadores de notificaciones de terceros
Los duplicados pueden ocurrir cuando otro código en su aplicación procesa la carga útil push de OneSignal y muestra su propia notificación además de la de OneSignal. Esto incluye:- Otros SDKs de push remoto (por ejemplo, Firebase Cloud Messaging) que reciben la misma carga útil.
- Manejadores de mensajes personalizados como un
FirebaseMessagingServiceen Android o unUNUserNotificationCenterDelegateen iOS que leen la carga útil entrante y construyen una notificación local a partir de ella.
Identificación de notificaciones de OneSignal
Cada notificación de OneSignal incluye un objetocustom con una clave i que contiene el UUID de la notificación de OneSignal:
JSON
Filtrar notificaciones de OneSignal en manejadores de terceros
En cualquier manejador que no sea de OneSignal, verifique la clavecustom.i y retorne anticipadamente cuando esté presente. OneSignal entonces maneja sus propias cargas útiles mientras su otro código continúa procesando las suyas.
- Android
- iOS
En un
FirebaseMessagingService personalizado u otro manejador de mensajes remotos:Kotlin
Manejadores de notificaciones Android
OneSignal expone dos callbacks de Android que le permiten interceptar y personalizar una notificación antes de que se muestre:onNotificationReceiveden una extensión de servicio de notificaciones — se ejecuta para cada push, incluso cuando la aplicación está en segundo plano.onWillDisplayen un listener de ciclo de vida en primer plano — se ejecuta solo cuando la aplicación está en primer plano.
La regla de preventDefault() y display()
OneSignal muestra cada notificación automáticamente a menos que la suprima con event.preventDefault(). Dos errores comunes causan duplicados:
- Llamar a
event.getNotification().display()sin llamar primero aevent.preventDefault()— muestra la notificación dos veces. - Publicar una notificación separada con
NotificationManagerCompat.notify()mientras OneSignal también muestra la original.
display() de OneSignal o su propio NotificationManagerCompat.notify(), nunca ambos.
onWillDisplay en un listener de ciclo de vida en primer plano:
Kotlin
Trabajo asíncrono dentro de callbacks
Cuando realice trabajo en segundo plano (llamadas de red, consultas a base de datos) antes de mostrar, llame apreventDefault() de forma síncrona en el callback y llame a display() solo después de que el trabajo asíncrono se complete. Retornar del callback sin preventDefault() permite que OneSignal muestre la notificación, y una llamada posterior a display() produce un duplicado.
Manejador en primer plano de iOS
OneSignal se establece como elUNUserNotificationCenterDelegate durante la inicialización del SDK. Si su aplicación también implementa el manejo de notificaciones en primer plano, la notificación puede mostrarse dos veces: una vez desde OneSignal y una vez desde su código.
Patrones comunes que causan duplicados:
- Implementar su propio
UNUserNotificationCenterDelegatesin reenviar llamadas a OneSignal, luego llamar acompletionHandler([.banner, .sound])y mostrar una alerta in-app personalizada desde el mismo método. - Programar una notificación local (
UNUserNotificationCenter.current().add(...)) en respuesta a un push entrante que OneSignal también está mostrando.
event.preventDefault() cuando desee renderizar la notificación usted mismo:
Swift
Múltiples instancias de aplicación
- Android
- iOS
- Web
Los duplicados pueden ocurrir cuando tiene instaladas las versiones de producción y desarrollo de su aplicación. Cada aplicación tiene un nombre de paquete único y recibe su propio token push.Mantenga presionada la notificación para confirmar qué instancia de aplicación la envió.
Consejos de diagnóstico
Para depurar duplicados más rápido, recopile y envíe lo siguiente al soporte de OneSignal:- ID de suscripción de OneSignal del dispositivo que recibió los duplicados
- ID del mensaje de OneSignal o un enlace al mensaje en el panel de control
- Lista de otras bibliotecas o plugins en su aplicación
- Registro de depuración que reproduzca el problema
- Pasos de reproducción detallados
Preguntas frecuentes
¿Qué sucede si tengo dos SDKs de notificación en mi aplicación?
Ambos SDKs pueden procesar y mostrar independientemente la misma notificación. OneSignal filtra sus propias notificaciones automáticamente, pero otros SDKs no lo hacen. Filtre las cargas útiles de OneSignal de los manejadores de su otro SDK verificando la clavecustom.i. Consulte Manejadores de notificaciones de terceros para ver ejemplos de código.
¿Cómo enviar push desde un proveedor anterior y OneSignal al mismo tiempo?
Puede hacer la transición gradualmente, pero evite enviar el mismo mensaje desde ambos proveedores.- Android: Elimine el código de manejo de notificaciones del SDK antiguo al integrar OneSignal y lanzar la aplicación. A medida que los usuarios actualicen, dejarán de recibir push del proveedor antiguo.
- iOS: Puede continuar enviando desde el proveedor antiguo temporalmente mientras los usuarios actualizan. Una vez que haya completado la transición, envíe solo desde OneSignal para evitar duplicados.
¿Cómo evitar múltiples notificaciones para actualizaciones que cambian rápidamente?
Use uncollapse_id en la API Crear notificación para reemplazar notificaciones anteriores en lugar de apilarlas. Cuando varias notificaciones comparten el mismo collapse_id, cada nueva reemplaza a la anterior en la bandeja. Esto es útil para actualizaciones de precios de acciones, marcadores en vivo, ETAs de entrega y actualizaciones frecuentes similares.
Páginas relacionadas
Solución de problemas del SDK móvil
Resuelva problemas comunes con la entrega de notificaciones push en iOS y Android.
Solución de problemas de web push
Depure problemas de suscripción, service worker y entrega de web push.
Solución de problemas de mensajes in-app
Corrija problemas con la visualización, los disparadores y los duplicados de mensajes in-app.
Extensiones de servicio móvil
Intercepte y personalice notificaciones push antes de mostrarlas en iOS y Android.
Notificaciones no mostradas (web)
Solucione notificaciones web push que se envían pero no se muestran.