Contenido del curso

Integración Nativa en iOS 18

Notificaciones locales en SwiftUI con UserNotifications

Resumen

Programar notificaciones locales en SwiftUI te permite comunicarte con el usuario incluso cuando tu aplicación no está activa. Aquí aprendes a configurar permisos, crear un NotificationManager y disparar alertas con título, cuerpo y sonido en iOS, todo paso a paso desde el framework UserNotifications.

¿Qué son las notificaciones locales y en qué se diferencian de las push?

En iOS existen dos grandes tipos de notificaciones, y entender la diferencia te evita complicarte la arquitectura desde el inicio.

Las notificaciones locales se generan dentro del propio dispositivo, sin servidores externos. Son ideales para recordatorios, alertas internas o procesos en segundo plano que dependen de la lógica de tu app. Las push notifications, en cambio, son remotas y requieren infraestructura externa para enviarse.

¿Cuándo conviene usar una notificación local? Cuando la alerta depende de una acción interna de la app, como un temporizador, un recordatorio o un proceso que no necesita conexión a un servidor.

¿Cómo se configura el NotificationManager en Swift?

Todo arranca creando un administrador centralizado dentro de la carpeta services, en un archivo llamado NotificationManager.

Lo primero es importar el framework UserNotifications, que es la clase que habilita todo el sistema de alertas en iOS. Después se crea una instancia compartida con una variable estática llamada shared, instanciada desde NotificationManager. Este patrón te permite acceder al administrador desde cualquier vista sin instanciarlo varias veces.

¿Cómo solicitar permisos al usuario para enviar notificaciones?

Las notificaciones son intrusivas, así que iOS exige pedir autorización explícita. Para eso se crea la función requestPermission, donde se invoca al centro de notificaciones.

El objeto clave aquí es UNUserNotificationCenter.current(), sobre el que llamas a requestAuthorization. En el parámetro options defines qué tipo de interacciones quieres permitir:

  • alert, para mostrar el cuadro visual de la notificación.
  • sound, para reproducir audio cuando llegue.
  • badge u otras opciones para contenido adicional.

La función devuelve dos valores: granted, que indica si el usuario aceptó, y error, que captura cualquier fallo. Con un simple if validas ambos casos e imprimes en terminal Permiso concedido, Permiso denegado o Error al solicitar permiso.

¿Por qué hay que editar el archivo Info.plist?

Apple requiere que declares explícitamente por qué tu app necesita enviar notificaciones, y eso se hace en Info.plist.

En la raíz del proyecto buscas la clave Privacy - User Notifications Usage Description y agregas un texto descriptivo, por ejemplo: Se solicita enviar notificaciones al usuario para alertar acerca de una acción dentro de la aplicación. Mientras más detallado sea el mensaje, mejor lo recibe el usuario en el diálogo de permisos.

¿Cómo programar una notificación local con título, cuerpo y sonido?

Una vez configurado el permiso, puedes crear una función llamada programarNotificacion dentro del NotificationManager.

El contenido se construye con la clase UNMutableNotificationContent, que expone propiedades como title, body y sound. Un ejemplo concreto sería un título Hola desde mi aplicación, un cuerpo Este es el contenido de mi notificación para el curso de iOS y un sonido .default, que usa el audio predeterminado del sistema.

¿Qué pasa si el teléfono está en modo No molestar? La notificación no se mostrará ni sonará, sin importar cómo la programes. El comportamiento depende siempre de la configuración del dispositivo.

¿Cómo se usa un trigger para retrasar la notificación?

Para disparar la alerta después de un tiempo, usas UNTimeIntervalNotificationTrigger.

Este trigger recibe dos parámetros: el intervalo en segundos y si debe repetirse. Por ejemplo, configurar un intervalo de cinco segundos sin repetición hace que, tras pulsar el botón, la notificación aparezca pasados esos cinco segundos en la barra del sistema.

¿Cómo se envía la solicitud al centro de notificaciones?

El último paso es empaquetar todo en un UNNotificationRequest con tres elementos: un identifier, el content y el trigger.

Para el identificador se usa UUID().uuidString, que genera un valor único y evita colisiones entre notificaciones. Después llamas a UNUserNotificationCenter.current().add(request) para registrar la solicitud. Si hay un error imprimes Error al programar la notificación; si todo sale bien, imprimes Notificación programada con éxito.

¿Cómo se conecta la vista en SwiftUI con el NotificationManager?

En la vista DemoNotificationsView se construye un VStack con un título grande Notificaciones en SwiftUI usando el modificador .largeTitle y .padding para separar elementos.

Debajo se agregan dos botones que disparan las acciones del administrador:

  1. Botón Solicitar permiso, que llama a NotificationManager.shared.requestPermission().
  2. Botón Programar notificación, que invoca NotificationManager.shared.programarNotificacion().

A cada botón se le aplica estilo con .padding, .foregroundColor(.white), .background(Color.blue) y .cornerRadius(8) para que se vean coherentes y limpios.

¿Por qué la notificación no aparece en el simulador de iOS?

Un detalle importante: el simulador de Xcode no tiene soporte completo para mostrar notificaciones locales en pantalla.

Aunque el código se ejecute sin errores y la consola confirme que la notificación fue programada, no verás nada en la barra del simulador. Para validar el resultado real necesitas correr la app en un dispositivo físico, donde tras pulsar Programar notificación y esperar cinco segundos aparecerá la alerta con su título y cuerpo.

Este tipo de notificaciones cubre escenarios internos sin necesidad de servidores. Cuando necesites alertas externas y en tiempo real, ahí entran las push notifications, que se trabajan más adelante en el proyecto final. ¿Qué notificación local te gustaría implementar primero en tu app?