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 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 Local Notifications y 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 |
|
|
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:
- La aplicación está activa es decir, está ejecutándose y en primer plano.
- La aplicación está en segundo plano.
- 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
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.