Usando Local Notifications en iOS

Autor: | Última modificación: 15 de noviembre de 2022 | Tiempo de Lectura: 4 minutos
Temas en este post: ,

Qué son las Local Notifications iOS

Las local notifications en iOS son un mecanismo que permite a una aplicación enviar información al usuario en algún momento del futuro, incluso si la aplicación se encuentra cerrada en el momento de la entrega de la notificación.

La notificación aparecerá como una alerta o bien en el centro de notificaciones del iPhone o iPad. Según como hayamos configurado nuestra notificación, y dependiendo de la intervención del usuario, nuestra aplicación podrá ser avisada de la entrega de la notificación.

Local Notifications en iOS

Local Notification apareciendo en forma de alerta modal (también podría hacerlo en el centro de notificaciones en caso de estar la pantalla bloqueada). Si el usuario toca «Close», no pasará nada. Si toca «Ahora te lo cuento», la aplicación será notificada.

Desgraciadamente, no es posible evitar el mostrar la alerta al usuario, es decir, no podemos configurar local notifications en iOS que sólo ejecute cierto código de nuestra aplicación en el momento de la recepción.

Es decir, el destinatario de las local notifications es siempre el usuario, y no la propia aplicación.

Diferencias entre las Local Notifications en iOS y las Push Notifications

Si ya conoces las Push Notifications que ofrece Apple, tal vez te estés preguntando la diferencia entre unas y otras. La principal diferencia es que las Push Notifications son externas, es decir, provienen de un servidor de Apple, mientras que las Local Notifications son, como su nombre indica, locales. Es decir, las genera la propia aplicación.

Push Notifications Local Notifications
  • Se envían a través de un servidor
  • Su entrega es inmediata (si es posible la entrega)
  • Disponible para iOS y OSX
  • Son locales, es decir, se generan en el propio iPhone o iPad
  • Su entrega puede ser diferida
  • Solo para iOS

Crear una Local Notification

Para crear una Local Notification, instanciamos la clase UILocalNotification:

[crayon lang="Objective C"]
UILocalNotification *notification = [[UILocalNotification alloc] init];

// debe de activarse dentro de 5 segundos
notification.fireDate = [[NSDate alloc] initWithTimeIntervalSinceNow:5];

// mensaje que saldrá en la alerta
notification.alertBody = self.nameTextField.text;

// sonido por defecto
notification.soundName = UILocalNotificationDefaultSoundName;

// título del botón
notification.alertAction = @"Ahora te lo cuento";
notification.hasAction = YES;

// activa la notificación
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
[/crayon]

fireDate es la fecha y hora en que se entregará la notificación al usuario.

La propiedad alertAction es el texto que aparecerá en el botón cuyo toque  llamará a la aplicación, en nuestro caso «Ahora te lo cuento».

La propiedad hasAction indica si queremos que nuestra aplicación sea notificada en caso de que el usuario toque el botón con el texto de alertAction.

soundName es el fichero de sonido que queremos que se reproduzca. Dicho fichero tiene que estar en el bundle de la aplicación. Para más información, mírate este artículo sobre formatos de sonido que acepta iOS y cómo reproducirlos. En el ejemplo, estamos usando el sonido por defecto del iPhone.

También se puede modificar al launch image que mostrará la aplicación y el badge del icono de la aplicación.

Qué ocurre cuando se dispara una Local Notification

Lo que ocurra dependerá del estado de la aplicación. Hay 3 posibilidades:

  1. La aplicación está activa es decir, está ejecutándose y en primer plano.
  2. La aplicación está en segundo plano.
  3. La aplicación está cerrada.

La aplicación está activa cuando se recibe la Local Notification

En este caso, excepcionalmente, el sistema operativo no mostrará ninguna alerta al usuario, sino enviará cierto mensaje a la aplicación.  Recordemos que el destinatario de la Local Notification es siempre el usuario, y en general la aplicación solo la recibirá si el usuario, tocando sobre un botón, la reenvía.

Sin embargo, en este caso, como la aplicación ya está activa, se considera que es mejor dejar que sea ella que muestre al usuario la información que considere adecuada.

En este caso, se ejecutará el método application:didReceiveLocalNotification:

[crayon lang="Objective C"]
-(void) application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Inside application:didReceiveLocalNotification:"
message:notification.alertBody
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alert show];
}
[/crayon]

La aplicación está en segundo plano cuando se recibe la Local Notification

En este caso, impepinablemente el sistema operativo mostrará la alerta. Si el usuario toca sobre el botón «Cerrar», no pasa nada y la alerta es eliminada. No obstante, si toca sobre el botón con el texto de alertAction, se le mandará el mensaje application:didReceiveLocalNotification: a la aplicación.

La aplicación está cerrada cuando se recibe la Local Notification

El comportamiento será similar al anterior: se muestra la alerta y le siguiente paso dependerá de lo que haga el usuario. Si toca el botón de «Cerrar», no ocurre nada más. Por otro lado, si toca el de alertAction (en nuestro caso, el que dice «Ahora te lo cuento»), se arrancará la aplicación pasándole la notificación como parámetro. Podremos obtenerla en el método application:didFinishLaunchingWithOptions: del NSDictionary que nos pasan como segundo parámetro. Queda más claro en el código de ejemplo:

[crayon lang="Objective C"]
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

if(notification){

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Inside application:didFinishLaunchingWithOptions:"
message:notification.alertBody
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alert show];
}
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[FRRViewController alloc] initWithNibName:@"FRRViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}

[/crayon]

Eliminar todas las Local Notifications en iOS pendientes

Se pueden eliminar alguna o todas las Local Notifications con los métodos cancelAllLocalNotifications y cancelNotification: de UIApplication.

Esquema y resumen

localNotifications

Código de ejemplo de Local Notifications

En GitHub puedes encontrar un proyecto de ejemplo que permite crear Local Notifications y observar su recepción. Nota, el código es para iOS5 y presupone ARC.