Envío de notificaciones automáticas en dispositivos iOS

Proporciona directamente contenido enriquecido a aplicaciones iOS

Mediante la utilización de tecnología de notificaciones automáticas, las aplicaciones del servidor pueden enviar contenidos enriquecidos a aplicaciones instaladas en dispositivos iOS y Android, lo cual le ahorra el problema y los gastos de implementar el Short Message Service (SMS) o el Multimedia Messaging Service (MMS) en sus aplicaciones de mensajería móvil. Michael Yuan le muestra cómo dar soporte a esta función fundamental en sus aplicaciones iOS. También verá cómo utilizar una biblioteca Java de fuente abierta que simplifica el proceso de notificación.

Michael J. Yuan, Chief Scientist, Ringful Health

Photo of Michael YuanEl Dr. Michael Yuan es un conocido tecnólogo en el área de computación de empresas y tecnologías móviles para consumidores. Es autor de 5 libros sobre ingeniería de software y publicó más de 40 artículos en revisiones de colegas y publicaciones para la industria. El Dr. Yuan es un pionero en el creciente campo del cuidado de la salud impulsado por los consumidores. Su trabajo en Ringful Health ha sido cubierto y reconocido en medios nacionales tales como Wall Street Journal, New York Times y Los Angeles Times.



13-07-2012

Antecedentes

Los mensajes SMS y MMS se entregan mediante portadores inalámbricos a dispositivos específicos mediante sus números de teléfono. Los desarrolladores de aplicaciones del lado del servidor que implementan el servicio de mensajería SMS/MMS deben hacer un gran esfuerzo para poder interactuar con la infraestructura de telecomunicaciones cerrada y existente—incluido obtener números de teléfono. (Leer más detalles sobre el desarrollo de las aplicaciones de SMS/MMS del lado del servidor en "Build mobile messaging into your web apps.") Los mensajes SMS/MMS no tienen conocimiento de las aplicaciones instaladas en el dispositivo del receptor.

La popularidad de los super teléfonos inteligentes como los dispositivos iPhone y Android (y sus parientes con Wi-Fi, como iPod Touch y iPad) creó la necesidad para una infraestructura de mensajería móvil moderna que pudiera proporcionar información de medios enriquecida de forma directa a las aplicaciones instaladas —en lugar de enviarla a números telefónicos — y que es más abierto y menos costosos que los SMS/MMS.

Mensajes de doble vía

Una de las mejores características de la infraestructura SMS/MMS es que las aplicaciones del servidor pueden recibir y responder a los mensajes enviados desde teléfonos. En cambio, la mensajería automática, es de una sola vía: solo se pueden enviar mensajes desde el servidor a las aplicaciones de un dispositivo. Pero ese no es un problema importante. En lugar de hacer que los usuarios "envíen el mensaje XYZ al 12345 para recibir información", les puede decir que "descarguen la aplicación XYZ para recibir información". Y mediante las mismas aplicaciones se puede cargar contenido directamente a su servidor cuando lo necesite, eliminando la necesidad de enviar mensajes al servidor.

Tanto Apple como Google han superado el desafío desarrollando una infraestructura basada en Internet que envía mensajes a dispositivos iOS y Android, respectivamente, desde aplicaciones de servidores. Push automáticas están diseñadas radicalmente para comunicarse con aplicaciones instaladas en dispositivos móviles. Pueden enviar texto, archivos de medios y datos específicos de las aplicaciones, como sonidos de alertas e insignias para mostrar en el ícono de la aplicación.

Este artículo explica cómo funciona la tecnología de notificación automática en la plataforma iOS y cómo incorporarla a sus aplicaciones. Para aprovechar al máximo el artículo, debe tener algo de experiencia en el desarrollo de Java e iOS.


Fundamentos de la tecnología automática iOS

Apple utiliza certificados digitales de clave pública para autenticar las solicitudes automáticas de su aplicación iOS, por lo tanto, primero necesita crear claves de autenticación y registrarlas con Apple. Se cubrirá este proceso sencillo,pero algo extenso, en la siguiente sección.

Luego, cada dispositivo que instale la aplicación y opte por recibir notificaciones automáticas para esa aplicación debe ser identificado. La secuencia funciona de la siguiente manera:

  1. Un cuadro de diálogo de alerta en la aplicación iOS le solicita permiso al usuario para recibir notificaciones automáticas.
  2. Si el usuario otorga el permiso, la aplicación iOS se contacta con el servicio de alertas Apple Push Notification (APN) para obtener una cadena de identificación (ID) que solo identifique a esta aplicación, instalada en este dispositivo. (Se puede pensar en la ID como análoga al número de teléfono del receptor en un escenario de mensajería tradicional).
  3. La aplicación iOS carga la ID a la aplicación de su servidor.
  4. Cuando la aplicación del servidor necesita enviar un mensaje automático, lo autentica con los servidores automáticos de Apple y luego utiliza la ID de los pasos 2 y 3 para especificar el receptor del mensaje.
  5. Si el dispositivo del receptor está online, recibe y procesa el mensaje. Si no lo está, el mensaje queda en cola y se entrega la próxima vez que esté online.

Una alternativa para su propio servidor: Urban Airship

Urban Airship es un servicio que le permite enviar mensajes son la necesidad de ejecutar su propio servidor (consulte Recursos). Se cargan sus claves privadas a Urban Airship y se utiliza la consola de mensajería de la web para enviar mensajes a sus usuarios. Urban Airship proporciona un iOS SDK que le permite a su aplicación registrar fácilmente cada dispositivo instalado con su servidor, de manera que esos dispositivos aparezcan en la consola de mensajería. A pesar de que Urban Airship simplifica su trabajo, puede ser costoso — y es necesaria la comprensión de conceptos básicos de notificación automática.

Los servicios APN le permiten a las aplicaciones de su servidor validar de forma periódica su lista almacenada de identificaciones de la aplicación. Eso le da la oportunidad de quitar las ID de los usuarios que borren la aplicación o cambien sus de autorización automática.

Esto suena como si llevara mucho trabajo, y de hecho lo hace. Es por eso que los servicios como Urban Airship (ver la barra lateral) para gestionar los mensajes a cambio de honorarios.

Después de mostrarle cómo registrar su aplicación, entraré en los detalles del desarrollo de una aplicación de notificación automática de iOS y, con la ayuda de una biblioteca Java de fuente abierta, sus componentes del servidor.


Registro de la aplicación

Para registrar su aplicación para notificaciones automáticas, primero debe crear un par de claves privadas/públicas para autenticar sus llamadas API contra los servidores APN. Puede hacer esto en la Mac mediante la aplicación KeyChain Access. Seleccione KeyChain Access > Asistente de certificado > Solicitar un certificado a la Autoridad de certificados para crear un archivo de solicitud de firmas de certificados. El archivo de solicitud contiene el par generado de claves públicas y la clave privada correspondiente se guarda en KeyChain Access. Asegúrese de seleccionar la opción Guardado en el disco en el cuadro de diálogo, como se muestra en la Figura 1:

Figura 1. Generación de un par de claves y solicitud de firma del programa KeyChain Access en la Mac
Generación de un par de claves y solicitud de firma del programa KeyChain Access en la Mac

Después, regístrese en el portal de provisión de aplicación de Apple (consulte Recursos) y cargue el archivo de solicitud de firma, que será asociado al perfil de provisión adecuado. La mayoría de las aplicaciones tienen perfil de provisión de desarrollo para los probadores y un perfil de producción para el App Store, por lo tanto, es probable que se carguen dos solicitudes de firmas. Después de cargar la solicitud de firma, el portal genera un certificado digital para que el usuario pueda descargarlo. El certificado contiene la clave pública, que ahora APN reconoce como asociada a su aplicación. La figura 2 muestra un ejemplo:

Figura 2. Certificado digital de Apple
Certificado digital de Apple

Descargue el certificado digital y haga doble clic en el archivo descargado. KeyChain Access ahora importa de manera automática el certificado digital y lo asocia a la clave privada generada cuando se creó la solicitud de firma. La figura 3 muestra un par de claves pública y privada en KeyChain Access:

Figura 3. Par de claves pública y privada en KeyChain Access
Par de claves pública y privada en KeyChain Access

Ahora, se exporta el par de claves a un archivo con un formato denominado Personal Information Exchange (p12). Cuando se crea el archivo p12, KeyChain Access le pide que asigne una clave para proteger la clave privada. Puede utilizar una contraseña vacía si lo desea.

A partir de este punto, todas sus solicitudes API al servidor automático APN deben estar encriptadas por una clave privada del archivo p12 y luego firmadas digitalmente por la clave pública del archivo p12, para verificar que la llamada API sea realmente generada por usted. Más adelante, en este artículo demostraré cómo utilizar las claves, cuando describa cómo interactuar con los servidores APN. (Si utiliza Urban Airship, le pide que cargue el archivo p12 junto con cualquier contraseña a su servidor de manera que pueda enviar mensajes automáticos en su nombre).

Ahora que tiene los certificados automáticos, debe volver a descargar e instalar sus perfiles de provisión de la aplicación—ya que ahora los perfiles están actualizados para dar soporte a la notificación automática de al aplicación.


Solicitud y almacenado de la credencial de un dispositivo

Su aplicación iOS necesita solicitar permiso al usuario para recibir las notificaciones automáticas en los dispositivos en que está instalado. Típicamente, se hace esto en el representante de la aplicación mediante una simple llamada API, como se muestra en el listado 1:

Listado 1. Solicitud de permiso al usuario
[[UIApplication sharedApplication]
    registerForRemoteNotificationTypes:
        (UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeSound | 
         UIRemoteNotificationTypeAlert)];

Si el usuario otorga el permiso, la aplicación automáticamente se pone en contacto con el servidor APN para obtener la credencial del dispositivo. La credencial le permite a APN identificar esta aplicación particular instalada en este dispositivo particular como un destino del mensaje. Este proceso es automático y se ejecuta en segundo plano. No es necesario escribir ningún código.

Después de que el servidor APN responde, se llama al didRegisterForRemoteNotificationsWithDeviceToken método en el representante de la aplicación, y se indica la credencial del dispositivo como parámetro del llamado. Debe guardar la credencial del dispositivo y cargarlo a su propio servidor de notificación automática, como se muestra en el listado 2:

Listado 2. Recepción de un ID y subida al servidor
- (void)application:(UIApplication*)application
         didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    NSString *tokenStr = [deviceToken description];
    NSString *pushToken = [[[[tokenStr 
      stringByReplacingOccurrencesOfString:@"<" withString:@""] 
      stringByReplacingOccurrencesOfString:@">" withString:@""] 
      stringByReplacingOccurrencesOfString:@" " withString:@""] retain];

   // Save the token to server

   NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
        
   [req setHTTPMethod:@"POST"];
   [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
   NSMutableData *postBody = [NSMutableData data];
   [postBody appendData:[[NSString stringWithFormat:@"username=%@", username] 
      dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"&token=%@", 
      pushToken] dataUsingEncoding:NSUTF8StringEncoding]];

   [req setHTTPBody:postBody];
   [[NSURLConnection alloc] initWithRequest:req delegate:nil];
}

Sería ideal que se asocie la credencial con alguna información que identifique al usuario (como el nombre de usuario de esa persona en su sistema), de manera que su servidor sepa a quien mandarle el mensaje más tarde. (Se puede pensar en esto como un análogo a asociar un número telefónico al nombre de la persona). Incluso si no asocia las credenciales con la información de identificación de usuario que usted posee, puede enviar mensajes a esos dispositivos, pero no puede personalizar el mensaje para cada usuario, ya que todo lo que tiene es una cadena de credenciales alfanumérica para el dispositivo de destino.

El servidor debe guardar la credencial y su información de identificación relacionada en una base de datos. En la mayoría de las aplicaciones, se guarda en la base de datos del perfil del usuario.


Envío de un mensaje automático

Para enviar un mensaje automático, su servidor:

  1. Busca una lista de ID de aplicaciones a la cual enviar el mensaje.
  2. Personaliza el mensaje para cada receptor basándose en el perfil del usuario de ese receptor.
  3. Se pone en contacto con el servidor de mensajería APN.

La API de los servicio Web del servidor APN es complicada. Afortunadamente para los desarrolladores de Java, la biblioteca JavaPNS de fuente abierta hace que trabajar con él sea más simple. Consulte Recursos para ver los enlaces para descargas y documentación de JavaPNS.

El código en el Listado 3 muestra cómo enviar un mensaje tipo SMS al dispositivo utilizando la biblioteca JavaPNS:

Listado 3. Envío de un mensaje automático
String[] devices = {"token1", "token2};
List<PushedNotification> notifications
 = Push.alert("Hello World!", "keypair.p12", "password", false, devices);

Los métodos de la interfaz principal de la biblioteca JavaPNS son métodos estáticos en la clase Push . APN le permite incorporar una variedad de contenidos en su mensaje. Consulte la guía de mensajería automática iOS para obtener una lista completa de los tipos de cargas útiles compatibles (consulte Recursos). La Push proporciona métodos de conveniencia para cada tipo de mensaje y controla la conversión del mensaje al formato JavaScript Object Notation (JSON) aceptado por los servidores APN. En el el Listado 3, keypair.p12 es el archivo p12 exportado desde KeyChain Access, y password es la contraseña del archivo p12. La de los dispositivos es una lista de credenciales de dispositivos recibida por la aplicación iOS. Todos esos dispositivos recibirán este mensaje automático. La false en el parámetro especifica que el mensaje debe enviarse al servidor de desarrollo APN (el recinto de seguridad) en lugar de su servidor de producción. (Recuerde que generalmente se crea un par de claves p12 para el recinto de seguridad y uno diferente para el servidor de producción).

El valor de retorno del llamado de método es una lista de objetos PushedNotification que se pueden utilizar para constatar el estado de la entrega automática, como se muestra en el Listado 4:

Listado 4. Verificación del estado de entrega automática
for (PushedNotification notification : notifications) {
    if (notification.isSuccessful()) {
        /* Apple accepted the notification and should deliver it */
    } else {
        String invalidToken = notification.getDevice().getToken();
        /* Add code here to remove invalidToken from your database */
    }
}

Si el objeto de notificación le informa que una cierta certificación de dispositivo ya no está activa—por ejemplo, si el usuario quitó la aplicación del dispositivo o deshabilitó la notificación en la configuración de la aplicación — debe quitar la certificación de la base de datos para no mandarle más mensajes.

Otra forma de mantener actualizada su lista activa de certificaciones de dispositivos es que la aplicación de su servidor compruebe la lista de forma periódica con los servidores APN. El Listado 5 muestra cómo consultar al servicio de información de APN utilizando JavaPNS para recibir una lista de certificaciones de dispositivos inválidos del recinto de seguridad de APN.

Listado 5. Verificación para actualizar las certificaciones activas de dispositivos
List<Device> inactiveDevices = Push.feedback("keypair.p12", "password", false);
/* remove inactive devices from your own list of devices */

Es importante no gastar recursos enviando mensajes a dispositivos que eliminaron la aplicación y optaron por no recibir notificaciones.


Consideraciones adicionales

Las notificaciones automáticas no pueden probarse en emuladores iOS, se debe implementar la aplicación a un dispositivo real para poder probarlo. Debido a que el certificado digital que se utiliza para autenticar el mensaje está asociado al perfil de provisión de la aplicación, es necesario realizar la prueba con el certificado de desarrollo al momento del desarrollo o distribución de la aplicación ad hoc. Se debe cambiar al certificado de producción después de que la aplicación haya sido aprobada para, y que esté disponible en, el App Store.

Además, es importante comprender que personalizar y enviar mensajes automáticos para una gran base de datos de usuarios es un trabajo intensivo de recursos. Por ejemplo, es costoso navegar en una base de datos con millones de usuarios cada 5 segundos para identificar los 10 usuarios que necesitan recibir un mensaje en ese momento. La infraestructura del lado del servidor requiere una planificación y un diseño minucioso para poder dar soporte a notificaciones automáticas frecuentes a una gran cantidad de usuarios. Por el contrario, enviar un mensaje automático a un millón de usuarios de una sola vez genera un gran tráfico que podría gestionarse de manera más eficaz mediante distintos hilos, en lugar de bloquear uno solo. La biblioteca JavaPNS proporciona una API fácil que utiliza distintos hilos para enviar mensajes automáticos a una gran cantidad de dispositivos de forma simultánea.


Conclusión

La tecnología Push le permite a las aplicaciones del servidor desviar a los portadores de las empresas de telecomunicaciones y enviar mensajes directamente a aplicaciones de dispositivos iOS a través de Internet. A pesar de que la implementación de la notificación automática no es trivial—la necesidad de los certificados SSL del lado del cliente de autenticar con los servidores de Apple es complicado—la ayuda de terceros, como Urban Airship y JavaPNS, puede facilitar la tarea de enviar notificaciones. Los SMS y MMS tienen su lugar, y son más confiables que la tecnología automática, pero se puede hacer que sus aplicaciones iOS sean más ricas y versátiles implementando los mensajes automáticos.

Recursos

Aprender

Obtener los productos y tecnologías

  • JavaPNS: Descargue JavaPNS JAR.
  • Evalúe productos de IBM de la manera que le convenga: descargue una evaluación de producto, pruebe un producto online, úselo en un entorno de nube o pase algunas horas en la SOA Sandbox aprendiendo a implementar la Arquitectura Orientada a Servicios con eficiencia.

Comentar

  • Participe en la Comunidad My developerWorks. Conéctese con otros usuarios developerWorks mientras explora los blogs, foros, grupos y wikis dirigidos a desarrolladores.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=825068
ArticleTitle=Envío de notificaciones automáticas en dispositivos iOS
publish-date=07132012