Contenido


Envío de notificaciones automáticas en dispositivos iOS

Proporciona directamente contenido enriquecido a aplicaciones iOS

Comments

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.

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.

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
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
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
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 para Descargar


Temas relacionados

  • Apple Push Notification Service: Esta sección de la guía de programación de notificaciones automáticas y locales de Apple es la fuente autorizada que indica cómo funciona el servicio push iOS.
  • Apple's application-provisioning portal: Regístrese aquí para obtener certificados SSL y perfiles de usuario de provisión para sus aplicaciones iOS.
  • Apple Push Notification Services Tutorial: Este tutorial escrito por Matthijs Hollemans es una guía paso por paso sobre cómo crear y trabajar con certificados SSL requeridos para las notificaciones push.
  • Urban Airship: Este servicio comercial simplifica varios de los aspectos de la comunicación con los servidores APN.
  • JavaPNS: Java PNS es una biblioteca simple para las interacciones de administración con los servidores APN de su aplicación. Consulte documentation and examples para iniciar.
  • JavaPNS: Descargue JavaPNS JAR.
  • " Build mobile text messaging into your web apps" (Michael Yuan, developerWorks, noviembre de 2011): Aprenda sobre la implementación de mensajería móvil tradicional en las aplicaciones del lado del servidor.
  • 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.

Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

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