Una notificación local es un mensaje que la aplicación envía al usuario sin intervención de un servidor remoto. Todos los datos se procesan y muestran directamente en el dispositivo del destinatario. Este mecanismo es adecuado para recordatorios, temporizadores y alarmas cuando la aplicación está en segundo plano o cerrada. Según la Documentación para desarrolladores de Apple, UNUserNotificationCenter proporciona una gestión centralizada de las notificaciones locales en iOS.
Puntos clave
Una notificación local es un mensaje activado que el sistema operativo genera y muestra en el mismo dispositivo donde está instalada la aplicación. A diferencia de las notificaciones push, las locales no pasan por un servidor externo — toda la lógica de programación se ejecuta en el cliente.
Estas notificaciones funcionan independientemente del estado de la aplicación: activa, minimizada o completamente cerrada. El sistema operativo se encarga de la entrega en el momento programado, mientras que el desarrollador solo especifica el contenido y el activador.
El sistema garantiza la entrega de la notificación local incluso sin conexión a la red. Esta es una ventaja clave sobre las notificaciones push, que requieren una conexión a Internet estable y un servidor activo.
Cada notificación local consta de tres partes: contenido (título, cuerpo, sonido), activador (condición de tiempo o geográfica) e identificador de solicitud. El identificador permite cancelar o actualizar la notificación antes de su entrega.
Un desarrollador puede programar hasta 64 notificaciones locales por aplicación en iOS y un número ilimitado en Android. Esta diferencia se debe a restricciones arquitectónicas de los sistemas operativos.
Ambas plataformas proporcionan sus propias API para trabajar con notificaciones locales. En iOS, el componente central es UNUserNotificationCenter, en Android — NotificationManager. A pesar de las diferentes interfaces, la lógica es la misma: la aplicación crea una solicitud, la registra en el sistema y el SO entrega la notificación en el momento programado.
iOS usa UNCalendarNotificationTrigger para eventos de calendario, UNTimeIntervalNotificationTrigger para intervalos y UNLocationNotificationTrigger para geolocalización. Android ofrece AlarmManager, WorkManager y programación precisa mediante setExact.
Desde Android 12 — SCHEDULE_EXACT_ALARM requiere un permiso especial del usuario. En iOS, el permiso se solicita una vez a través de UNUserNotificationCenter.requestAuthorization, y el usuario elige el nivel de acceso: banners, sonidos, insignias.
Las notificaciones locales se clasifican por tipo de activador, no por contenido. Cada tipo determina cuándo y en qué condiciones se mostrará la notificación al usuario.
En iOS y Android, los tipos de activadores se implementan de manera diferente, aunque la clasificación lógica es la misma. iOS usa UNCalendarNotificationTrigger para fechas, UNTimeIntervalNotificationTrigger para intervalos y UNLocationNotificationTrigger para geolocalización. Android ofrece AlarmManager con setExact y setRepeating, así como WorkManager para tareas diferidas.
| Tipo de activador | Descripción | Ejemplo |
|---|---|---|
| Intervalo de tiempo | Notificación N segundos después del inicio | Temporizador de cuenta regresiva |
| Fecha de calendario | Notificación en una fecha y hora específicas | Recordatorio de reunión |
| Geolocalización | Notificación al entrar/salir de una región | Recordatorio en la tienda |
| Inmediato | Entrega instantánea al llamar a la API | Notificación de descarga |
iOS también admite UNNotificationAttachment — adjuntar una imagen, audio o video al cuerpo de la notificación. Android admite plantillas personalizadas con botones e imágenes grandes mediante NotificationCompat.Style.
La elección del activador depende del escenario: los recordatorios de calendario funcionan mejor con activadores de calendario, los recordatorios geográficos con geolocalización. Los activadores de intervalo son adecuados para eventos recurrentes con un período fijo.
En iOS, las notificaciones locales son entregadas por el sistema incluso cuando la aplicación está cerrada — UNUserNotificationCenter gestiona la cola de forma independiente. En Android, la entrega depende del mecanismo elegido: AlarmManager se activa incluso con la pantalla apagada, mientras que WorkManager tiene en cuenta el ahorro de energía.
Las notificaciones locales resuelven tareas donde la infraestructura externa es excesiva o no está disponible. Escenarios principales: recordatorios, temporizadores, consejos de incorporación y acciones diferidas.
Las investigaciones de Localytics muestran que las aplicaciones que usan recordatorios locales retienen un 35% más de usuarios en la primera semana después de la instalación. Esto convierte a las notificaciones locales en una poderosa herramienta de incorporación.
Es importante no abusar de la frecuencia — el sistema agrupa las notificaciones de la misma aplicación y el usuario puede desactivar todas las notificaciones locales si se vuelven molestas. La frecuencia óptima es de no más de 2–3 notificaciones al día para eventos no críticos.
Para programar una notificación local en Android, usa NotificationManager junto con AlarmManager. En Android 8+, primero debes crear un canal de notificaciones, de lo contrario la notificación no se mostrará.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Recordatorios",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Canal para recordatorios de tareas"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
val intent = Intent(this, ReminderReceiver::class.java).apply {
putExtra("notification_id", notificationId)
putExtra("channel_id", channelId)
}
val pendingIntent = PendingIntent.getBroadcast(
this, notificationId.hashCode(),
intent, PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMillis,
pendingIntent
)
En Android 12+, verifica el permiso SCHEDULE_EXACT_ALARM antes de llamar a setExact. Si el permiso no está concedido — usa setWindow, que garantiza la entrega dentro de una ventana de tiempo.
Cuando AlarmManager se activa, el sistema envía un Intent de difusión que es recibido por BroadcastReceiver. Dentro de él, debes crear y mostrar la notificación a través de NotificationManager. Asegúrate de que PendingIntent use FLAG_UPDATE_CURRENT, de lo contrario las notificaciones antiguas seguirán usando un Intent desactualizado cuando los datos cambien.
En iOS, las notificaciones locales se crean a través de UNUserNotificationCenter usando UNMutableNotificationContent y uno de los activadores. Antes de programar, debes solicitar permiso al usuario.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Recordatorio de tarea"
content.body = "No olvides completar el informe antes de las 18:00"
content.sound = .default
content.userInfo = ["task_id": "42"]
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "task_reminder_42",
content: content,
trigger: trigger
)
center.add(request)
iOS admite hasta 64 solicitudes simultáneas de notificaciones locales. Si se supera el límite, el sistema rechaza nuevas solicitudes hasta que las activas se entreguen o cancelen. Usa getPendingNotificationRequests para verificar la cola actual.
Cuando un usuario interactúa con una notificación local en iOS, se llama al método userNotificationCenter:didReceive response del delegado UNUserNotificationCenterDelegate. Este método proporciona el identificador de solicitud, actionIdentifier (qué botón se presionó) y userInfo personalizado. Esto permite distinguir entre una simple apertura de notificación y la pulsación de un botón de acción específico.
Para que las notificaciones locales sean útiles y no molesten al usuario, sigue varias reglas clave. Primero: controla la frecuencia — no más de 2–3 notificaciones al día para eventos no críticos, de lo contrario el usuario desactivará todas las notificaciones de la aplicación.
Segundo: dale al usuario la opción de elegir. Añade en la interfaz la posibilidad de desactivar ciertos tipos de notificaciones locales. En Android, usa un NotificationChannel separado con importancia baja; en iOS, usa una categoría separada en la configuración de la aplicación.
Tercero: relevancia contextual — la notificación debe aparecer cuando el usuario la necesita. Los activadores geográficos son ideales para recordatorios cerca de casa, los de calendario para reuniones, los de intervalo para actividades regulares como beber agua o estirarse. No mezcles tipos innecesariamente.
Cuarto: prueba en dispositivos reales. El simulador de iOS no emula todos los escenarios de entrega de notificaciones locales, especialmente en segundo plano. En Android, usa adb shell dumpsys notification para verificar la cola de notificaciones programadas y sus parámetros. Quinto: siempre proporciona al usuario la posibilidad de desactivar las notificaciones a través de la interfaz de la aplicación — este es un requisito obligatorio de UX y de las directrices de revisión de la App Store.
Preguntas frecuentes
Una notificación local se programa y entrega desde el dispositivo sin intervención del servidor. Una notificación push requiere un servicio externo (FCM, APNS) y conexión a Internet. Las locales funcionan sin conexión, las push solo con acceso a la red.
iOS limita a 64 solicitudes programadas simultáneamente. Android no tiene un límite estricto, pero más de 500 notificaciones pueden reducir el rendimiento del sistema y afectar el tiempo de entrega.
Sí, en iOS usa removePendingNotificationRequests con el identificador de solicitud. En Android, llama a NotificationManager.cancel o cancela el PendingIntent a través de AlarmManager. Un identificador único es obligatorio para la cancelación.
En iOS, el permiso es obligatorio a través de requestAuthorization. En Android 13+ (Tiramisu), también se requiere el permiso POST_NOTIFICATIONS. Las versiones anteriores de Android no requieren permiso explícito para notificaciones locales.
En iOS, crea UNNotificationAction y agrégalo a UNNotificationCategory. En Android, usa NotificationCompat.Builder.addAction con un PendingIntent dirigido a BroadcastReceiver. Cada botón activa una acción separada en la aplicación.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también