Apple reconoció un error en iOS 17 que causaba duplicados. Esto se corrigió en iOS 17.3. Leer más.
Cómo OneSignal previene entregas duplicadas
OneSignal deduplica las entregas antes de que salgan de nuestros servidores. Cada envío se verifica en dos niveles: la misma notificación nunca se entrega dos veces a la misma suscripción, y nunca dos veces al mismo token de dispositivo, incluso si el token se mueve a una suscripción diferente durante el envío. Las claves de idempotencia extienden esta protección a sus propios reintentos de API, y los SDKs móviles omiten las notificaciones que ya han procesado. Debido a estas verificaciones, los duplicados en un dispositivo generalmente se originan en el pipeline de envío o en el código de la aplicación que muestra notificaciones. Las secciones a continuación le ayudan a encontrar dónde.Comience aquí
Seleccione la sección que mejor se ajuste a su situación:- Envía mensajes a través de la API desde su propio backend o pipeline → 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
- Notificaciones antiguas, ya entregadas, reaparecen cuando la aplicación se abre en Android → son notificaciones restauradas, no duplicados. Consulte Notificaciones restauradas
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, y también para las notificaciones restauradas.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(), lo que 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.
Complete el trabajo asíncrono en un plazo de 30 segundos. El SDK deja de esperar el callback después de ese tiempo, y una notificación retenida por preventDefault() se descarta sin mostrarse.
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.
¿OneSignal tiene salvaguardas contra el envío de duplicados a mi audiencia?
Sí. Las entregas se deduplican en dos niveles antes de salir de los servidores de OneSignal: por notificación por suscripción, y por notificación por token de dispositivo. Sus propios reintentos de API están protegidos por claves de idempotencia. Consulte Cómo OneSignal previene entregas duplicadas.¿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.
Gestión de la bandeja de notificaciones
Comportamiento de clic, descarte, restauración y borrado de notificaciones móviles.