Compartir vía


Notificaciones push en iOS

Importante

La información de esta sección pertenece a iOS 9 y versiones anteriores, se ha dejado aquí para admitir versiones anteriores de iOS. Para iOS 10 y versiones posteriores, consulte la guía del marco de notificaciones de usuario para admitir notificaciones locales y remotas en un dispositivo iOS.

Las notificaciones push deben ser breves y solo deben contener suficientes datos para notificar a la aplicación móvil de que debe ponerse en contacto con la aplicación de servidor para obtener una actualización. Por ejemplo, cuando llega un nuevo correo electrónico, la aplicación de servidor solo notificará a la aplicación móvil de que ha llegado el nuevo correo electrónico. La notificación no contendrá el nuevo correo electrónico. La aplicación móvil recuperará los nuevos correos electrónicos del servidor cuando sea necesario.

En el centro de las notificaciones push de iOS se encuentra Apple Push Notification Service (APNs). Se trata de un servicio proporcionado por Apple que es responsable de enrutar las notificaciones de un servidor de aplicaciones a dispositivos iOS. En la imagen siguiente se muestra la topología de las notificaciones push para iOS: Esta imagen muestra la topología de las notificaciones push para iOS

Las propias notificaciones remotas son cadenas con formato JSON que siguen el formato y los protocolos especificados en la sección sobre la carga de notificación de la guía de programación de notificaciones locales y push en la documentación para desarrolladores de iOS.

Apple mantiene dos entornos de APNs: un espacio aislado y un entorno de producción. El entorno de espacio aislado está diseñado para realizar pruebas durante la fase de desarrollo y se puede encontrar en gateway.sandbox.push.apple.com en el puerto TCP 2195. El entorno de producción está diseñado para usarse en aplicaciones que se han implementado y se puede encontrar en gateway.push.apple.com en el puerto TCP 2195.

Requisitos

La notificación push debe cumplir las siguientes reglas que dicta la arquitectura de APNs:

  • Límite de mensajes de 256 bytes: el tamaño completo del mensaje de la notificación no debe superar los 256 bytes.
  • Sin confirmación de recepción: APNs no proporciona al remitente ninguna notificación de que un mensaje haya llegado al destinatario previsto. Si el dispositivo no es accesible y se envían varias notificaciones secuenciales, se perderán todas las notificaciones excepto la más reciente. Solo se entregará la notificación más reciente al dispositivo.
  • Cada aplicación requiere un certificado seguro: la comunicación con APNs debe realizarse mediante SSL.

Creación y uso de certificados

Cada uno de los entornos mencionados en la sección anterior necesita su propio certificado. En esta sección se explica cómo crear un certificado, asociarlo a un perfil de aprovisionamiento y, después, obtener un certificado de intercambio de información personal para usarlo con PushSharp.

  1. Para crear un certificado, vaya al portal de aprovisionamiento de iOS en el sitio web de Apple, como se muestra en la captura de pantalla siguiente (fíjese en el elemento de menú App IDs a la izquierda):

    Portal de aprovisionamiento de iOS en el sitio web de Apples

  2. Vaya a la sección App IDs y cree un nuevo identificador de aplicación, como se muestra en la captura de pantalla siguiente:

    Vaya a la sección Identificadores de aplicación y cree un nuevo id. de aplicación

  3. Al hacer clic en el botón +, podrá escribir la descripción y un id. de agrupación para el identificador de aplicación, como se muestra en la captura de pantalla siguiente:

    Escriba la descripción y un identificador de agrupación para el id. de la aplicación

  4. Asegúrese de seleccionar Explicit App ID y de que el identificador de agrupación no termina en *. Esto crearía un identificador que sirve para varias aplicaciones, pero los certificados de notificación push deben ser para una sola aplicación.

  5. En App Services, seleccione Push Notifications:

    Seleccionar notificaciones push

  6. Presione Submit para confirmar el registro del nuevo identificador de aplicación:

    Confirmar registro del nuevo id. de aplicación

  7. Ahora debe crear el certificado para el id. de la aplicación. En el panel de navegación izquierdo, vaya a Certificates > All y seleccione el botón +, como se muestra en la captura de pantalla siguiente:

    Crear el certificado para el id. de aplicación

  8. Seleccione si quiere usar un certificado de desarrollo o producción:

    Seleccionar un certificado de desarrollo o producción

  9. Después, seleccione el nuevo identificador de aplicación que acaba de crear:

    Seleccionar el nuevo id. de aplicación que acaba de crear

  10. Se mostrarán instrucciones que le guiarán por el proceso de creación de una solicitud de firma de certificado mediante la aplicación Acceso a Llaveros en su equipo Mac.

  11. Ahora que se ha creado el certificado, debe usarse como parte del proceso de compilación para firmar la aplicación para que pueda registrarse con APNs. Esto requiere la creación e instalación de un perfil de aprovisionamiento que use el certificado.

  12. Para crear un perfil de aprovisionamiento de desarrollo, vaya a la sección Provisioning Profiles y siga los pasos usando el identificador de aplicación que acabamos de crear.

  13. Una vez que haya creado el perfil de aprovisionamiento, abra Xcode Organizer y actualícelo. Si el perfil de aprovisionamiento que ha creado no aparece, puede que sea necesario descargarlo desde el portal de aprovisionamiento de iOS e importarlo manualmente. En la captura de pantalla siguiente se muestra un ejemplo de Organizer con el perfil de aprovisionamiento agregado:
    Esta captura de pantalla muestra un ejemplo de Organizer con el perfil de aprovisionamiento agregado

  14. En este punto, es necesario configurar el proyecto de Xamarin.iOS para usar este perfil de aprovisionamiento recién creado. Esto se hace desde el cuadro de diálogo Project Options, en la pestaña iOS Bundle Signing, como se muestra en la captura de pantalla siguiente:
    Configure el proyecto de Xamarin.iOS para usar este perfil de aprovisionamiento recién creado

En este momento, la aplicación está configurada para funcionar con notificaciones push. Sin embargo, todavía es necesario realizar algunos pasos más con el certificado. Este certificado está en formato DER y no es compatible con PushSharp, que requiere un certificado de intercambio de información personal (PKCS12). Para convertir el certificado para que PushSharp pueda usarlo, realice estos pasos finales:

  1. Descargue el archivo de certificado: inicie sesión en el portal de aprovisionamiento de iOS, vaya a la pestaña Certificates, seleccione el certificado asociado con el perfil de aprovisionamiento correcto y elija Download.
  2. Abra Acceso a Llaveros: esta aplicación es una interfaz gráfica de usuario para el sistema de administración de contraseñas en OS X.
  3. Importe el certificado: si el certificado aún no está instalado, vaya a Archivo > Importar ítems en el menú de Acceso a Llaveros. Vaya al certificado que ha exportado anteriormente y selecciónelo.
  4. Exporte el certificado: expanda el certificado para que la clave privada asociada esté visible, haga clic con el botón derecho en la clave y elija Exportar. Se le pedirá un nombre de archivo y una contraseña para el archivo exportado.

Con esto, hemos terminado con los certificados. Hemos creado un certificado que se usará para firmar aplicaciones de iOS y convertir ese certificado en un formato que se pueda usar con PushSharp en una aplicación de servidor. Ahora vamos a analizar cómo interactúan las aplicaciones de iOS con APNs.

Registro con APNs

Para que una aplicación de iOS pueda recibir una notificación remota, debe registrarse con APNs. APNs generará un token de dispositivo único y lo devolverá a la aplicación de iOS. Después, la aplicación de iOS tomará el token de dispositivo y se registrará en el servidor de aplicaciones. Una vez que esto sucede, se completa el registro y el servidor de aplicaciones puede enviar notificaciones push al dispositivo móvil.

En teoría, el token de dispositivo puede cambiar cada vez que una aplicación de iOS se registra en APNs, pero en la práctica esto no sucede con frecuencia. Como optimización, una aplicación puede almacenar en caché el token de dispositivo más reciente y actualizar el servidor de aplicaciones solo cuando el token cambia. En el diagrama siguiente se muestra el proceso de registro y obtención de un token de dispositivo:

Este diagrama muestra el proceso de registro y obtención de un token de dispositivo

El registro con APNs se controla en el método FinishedLaunching de la clase Application Delegate llamando a RegisterForRemoteNotificationTypes en el objeto UIApplication actual. Cuando una aplicación de iOS se registra con APNs, también debe especificar qué tipos de notificaciones remotas quiere recibir. Estos tipos de notificaciones remotas se declaran con la enumeración UIRemoteNotificationType. El siguiente fragmento de código es un ejemplo de cómo una aplicación de iOS puede registrarse para recibir notificaciones de distintivo y de alertas remotas:

if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
    var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
                       UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                       new NSSet ());

    UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
    UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
    UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}

La solicitud de registro de APNs se produce en segundo plano y, cuando se recibe la respuesta, iOS llama al método RegisteredForRemoteNotifications en la clase AppDelegate y pasa el token de dispositivo registrado. El token se incluirá en un objeto NSData. En el fragmento de código siguiente se muestra cómo recuperar el token de dispositivo proporcionado por APNs:

public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
    // Get current device token
    var DeviceToken = deviceToken.Description;
    if (!string.IsNullOrWhiteSpace(DeviceToken)) {
        DeviceToken = DeviceToken.Trim('<').Trim('>');
    }

    // Get previous device token
    var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

    // Has the token changed?
    if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
    {
        //TODO: Put your own logic here to notify your server that the device token has changed/been created!
    }

    // Save new device token
    NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}

Si se produce un error en el registro por algún motivo (por ejemplo, el dispositivo no está conectado a Internet), iOS llama a FailedToRegisterForRemoteNotifications en la clase Application Delegate. En el siguiente fragmento de código se muestra cómo mostrar una alerta al usuario informándole de que se ha producido un error en el registro:

public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
    new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}

Mantenimiento de tokens de dispositivo

Los tokens de dispositivo expiran o cambian con el tiempo. Por tanto, las aplicaciones de servidor tendrán que realizar una limpieza interna y purgar estos tokens expirados o modificados. Cuando una aplicación envía una notificación push a un dispositivo que tiene un token expirado, APNs registra y guarda ese token expirado. Después, los servidores pueden consultar APNs para averiguar qué tokens han expirado.

APNs anteriormente proporcionaba un servicio de comentarios: un punto de conexión HTTPS que se autenticaba por medio del certificado creado para enviar notificaciones push y devolver datos sobre qué tokens habían expirado. Apple ha dejado de usar este servicio y lo ha quitado.

En su lugar, hay un nuevo código de estado HTTP para informar de lo mismo que notificaba anteriormente el servicio de comentarios:

410: el token de dispositivo ya no está activo para el tema.

Además, en el cuerpo de la respuesta aparecerá una nueva clave de datos JSON timestamp:

Si el valor del encabezado :status es 410, el valor de esta clave es la última vez en la que APNs confirmó que el token de dispositivo ya no era válido para el tema.

Detenga la inserción de notificaciones hasta que el dispositivo registre un token con una marca de tiempo posterior con el proveedor.

Resumen

En este artículo se han presentado los conceptos clave en relación con las notificaciones push en iOS. Se ha explicado el rol de Apple Push Notification Service (APNs). También se ha tratado la creación y el uso de los certificados de seguridad que son esenciales para APNs. Por último, este documento ha terminado con una explicación sobre cómo los servidores de aplicaciones pueden usar servicios de comentarios para dejar de hacer un seguimiento de los tokens de dispositivo expirados.