Generador de Payload JSON para Notificaciones Push FCM y APNs
Construye payloads de prueba para notificaciones push móviles en los formatos de Firebase Cloud Messaging (FCM HTTP v1) y Apple Push Notification service (APNs) lado a lado. Introduce el título, el cuerpo, el contador de badge, el flag de sonido y cualquier dato personalizado clave-valor en un único formulario, y copia el JSON resultante directamente en Postman, curl o tu backend. Útil al validar la estructura de notificación antes de integrar el Firebase Admin SDK o el endpoint HTTP/2 de APNs.
💡 Sobre esta herramienta
FCM y APNs codifican la misma notificación con estructuras JSON diferentes. FCM HTTP v1 coloca los campos comunes bajo message.notification.title/body, envía los datos personalizados como message.data (solo valores string) y expone overrides por plataforma en message.android.notification y message.apns.payload.aps. El payload directo de APNs anida la alerta en aps.alert.title/body, sitúa badge y sound dentro de aps y espera los datos personalizados en el nivel raíz, fuera del diccionario aps. Cambiar entre ambos formatos manualmente lleva a errores frecuentes, por lo que este generador muestra las dos disposiciones desde una sola entrada.
🧐 Preguntas frecuentes
Q: ¿Es compatible la salida con la API legacy /fcm/send de FCM?
A: No. La herramienta emite payloads del endpoint FCM HTTP v1 (https://fcm.googleapis.com/v1/projects/{project}/messages:send). El endpoint legacy quedó descontinuado en junio de 2024 y los formatos de respuesta, autenticación y wrapper message cambiaron en v1.
Q: ¿Los valores de los datos personalizados pueden ser números u objetos JSON anidados?
A: La herramienta emite todos los valores como string. FCM HTTP v1 exige que los valores del map data sean strings; pasar números u objetos anidados ahí devuelve un 400. APNs en el nivel raíz es más permisivo, pero el código multiplataforma suele mantener todo como string por simetría.
Q: ¿Se puede asignar aps.sound a un archivo de sonido personalizado?
A: El toggle aquí emite "sound": "default". Para usar un archivo .caf empaquetado en la app, copia el JSON y reemplaza "default" por el nombre del archivo. Para alertas críticas, reemplaza el string por el diccionario {name, critical, volume} documentado en la especificación de APNs.
Q: ¿Qué diferencia hay entre dejar badge vacío y poner 0?
A: Dejarlo vacío omite el campo badge, por lo que el badge actual de la app no cambia. Enviar "badge": 0 lo borra explícitamente — útil cuando el usuario ya leyó los mensajes y quieres resetear el contador. Añade el 0 a mano tras copiar si necesitas ese comportamiento.
Q: ¿Se puede enviar el JSON generado tal cual? A: La estructura del payload cumple con la especificación, pero todavía hace falta adjuntar un bearer token OAuth 2.0 para FCM v1 o un header JWT y un device token de APNs antes de enviar. La herramienta sólo genera el cuerpo, no el transporte.
📚 Cuándo usar FCM y cuándo conectar APNs directamente
Equipos que ya tienen Firebase configurado suelen mandar todas las notificaciones — Android, iOS y Web Push — vía FCM HTTP v1, porque un solo endpoint unifica la entrega a múltiples plataformas y el Firebase Admin SDK abstrae OAuth 2.0 y la asignación de tópicos. Sin embargo, hay escenarios donde conviene hablar con APNs directamente: cuando se necesita la menor latencia posible para el usuario final (FCM añade un salto extra Google → Apple), cuando se quiere usar tokens de team o key APNs sin pasar por el ciclo de credenciales de Google Cloud, o cuando se envían notificaciones críticas con interruption-level: critical que requieren entitlements iOS específicos y respuestas detalladas de APNs.
El campo apns-priority (10 = inmediato, 5 = power-friendly) y el header apns-push-type (alert, background, voip, complication, fileprovider, mdm) son ejemplos de control granular que FCM resume en abstracciones más altas. Si tu app es VoIP o usa Live Activity, vas a querer construir el payload APNs directo, y este generador te muestra exactamente qué estructura espera el servidor de Apple. Comparando los dos paneles, también detectas casos donde una clave de datos personalizada debe moverse de message.data (FCM) al nivel raíz (APNs directo).