Notificaciones push en iOS
Importante
La información de esta sección pertenece a iOS 9 y versiones anteriores, se ha mantenido aquí para dar soporte a las versiones antiguas de iOS. Para iOS 10 y versiones posteriores, consulte la guía del marco de notificaciones de usuario de para admitir notificaciones locales y remotas en un dispositivo iOS.
Las notificaciones push deben mantenerse breves y solo contener suficientes datos para notificar a la aplicación móvil 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 a la aplicación móvil que ha llegado el nuevo correo electrónico. La notificación no contendrá el nuevo correo electrónico. A continuación, la aplicación móvil recuperaría los nuevos correos electrónicos del servidor cuando fuera adecuado.
En el centro de las notificaciones push de iOS está el Apple Push Notification Gateway Service (APNS). Este es 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 notificación de inserción para iOS:
Las notificaciones remotas son cadenas con formato JSON que cumplen con el formato y los protocolos especificados en la sección Carga de la 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 de espacio aislado de y un entorno de de producción de. 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 que se pueden encontrar en gateway.push.apple.com
en el puerto TCP 2195.
Requisitos
La notificación push debe observar 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.
- no hay confirmación de recibo: APNS no proporciona al remitente ninguna notificación de que un mensaje lo hizo al destinatario deseado. Si el dispositivo no es accesible y se envían varias notificaciones secuenciales, todas las notificaciones excepto la más reciente se perderán. 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 a través de SSL.
Creación y uso de certificados
Cada uno de los entornos mencionados en la sección anterior requiere su propio certificado. En esta sección se explica cómo crear un certificado, asociarlo a un perfil de aprovisionamiento y, a continuación, obtener un certificado de Intercambio de información personal para usarlo con PushSharp.
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 (observe el elemento de menú Identificadores de aplicación a la izquierda):
A continuación, vaya a la sección Id. de aplicación y cree un nuevo identificador de aplicación, como se muestra en la captura de pantalla siguiente:
Al hacer clic en el botón +, podrá escribir la descripción y un identificador de conjunto para el ID de la aplicación, tal como se muestra en la siguiente captura de pantalla.
Asegúrese de seleccionar ID de aplicación explícita y que el identificador de agrupación no termine con un
*
. Esto creará un identificador que es bueno para varias aplicaciones y los certificados de notificación push deben ser para una sola aplicación.En Servicios de Aplicaciones, seleccione Notificaciones push:
Y presione Enviar para confirmar el registro del nuevo identificador de aplicación:
A continuación, debe crear el certificado para el identificador de la aplicación. En la navegación izquierda, vaya a Certificados > Todos y seleccione el botón
+
, como se muestra en la captura de pantalla siguiente.Seleccione si desea usar un certificado de desarrollo o producción:
A continuación, seleccione el nuevo identificador de aplicación que acabamos de crear:
Se mostrarán instrucciones que le guiarán por el proceso de creación de un solicitud de firma de certificado mediante la aplicación acceso a llaveros de en el equipo Mac.
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 APN. Esto requiere crear e instalar un perfil de aprovisionamiento que use el certificado.
Para crear un perfil de aprovisionamiento de desarrollo, vaya a la sección Perfiles de aprovisionamiento y siga los pasos para crearlo con el identificador de aplicación que acabamos de crear.
Una vez que haya creado el perfil de aprovisionamiento, abra Xcode Organizer y actualícelo. Si el perfil de aprovisionamiento que creó no aparece, podría ser necesario descargarlo del Portal de Aprovisionamiento de iOS e importarlo manualmente. En la siguiente captura de pantalla se muestra un ejemplo del Organizador con el perfil de aprovisionamiento agregado.
En este momento, 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 Opciones de proyecto, en la pestaña Firma del paquete de iOS, como se muestra en la siguiente captura de pantalla.
En este momento, la aplicación está configurada para trabajar con notificaciones push. Sin embargo, todavía hay algunos pasos más necesarios con el certificado. Este certificado está en formato DER que 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:
- Descargar el archivo de certificado: inicie sesión en el portal de aprovisionamiento de iOS, elija la pestaña Certificados, seleccione el certificado asociado con el perfil de aprovisionamiento correcto y elija Descargar .
- Open Keychain Access: esta aplicación es una interfaz gráfica de usuario para el sistema de administración de contraseñas en OS X.
- Importar el certificado: si el certificado aún no está instalado, Archivo... Importar elementos desde el menú Acceso a llaveros. Vaya al certificado que exportó anteriormente y selecciónelo.
- Exportar 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.
En este momento hemos terminado con los certificados. Hemos creado un certificado que se usará para firmar aplicaciones iOS y convertir ese certificado en un formato que se puede usar con PushSharp en una aplicación de servidor. A continuación, veamos cómo interactúan las aplicaciones iOS con APNS.
Registro con APNS
Antes de 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 iOS. A continuación, la aplicación iOS tomará el token de dispositivo y, a continuación, 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 solo actualizar el servidor de aplicaciones cuando cambia. En el diagrama siguiente se 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 de delegado de aplicación 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 desea recibir. Estos tipos de notificación remota se declaran en la enumeración UIRemoteNotificationType
. El siguiente fragmento de código es un ejemplo de cómo una aplicación de iOS se puede registrar para recibir alertas e insignias 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, cuando se recibe la respuesta, iOS llamará al método RegisteredForRemoteNotifications
en la clase AppDelegate
y pasará 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 llamará a FailedToRegisterForRemoteNotifications
en la clase de delegado de aplicación. En el fragmento de código siguiente se muestra cómo mostrar una alerta al usuario que les informa de que se produjo 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 del token de dispositivo
Los tokens de dispositivo expirarán o cambiarán con el tiempo. Debido a este hecho, las aplicaciones de servidor tendrán que realizar alguna 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 registrará y guardará ese token expirado. A continuación, los servidores pueden consultar APNS para averiguar qué tokens han expirado.
APNS proporcionaba un servicio de comentarios: un punto de conexión HTTPS que se autentica a través del certificado que se creó para enviar notificaciones push y devuelve datos sobre qué tokens han expirado. Apple ha desaprobado esto y lo ha eliminado.
En su lugar, hay un nuevo código de estado HTTP para el caso que el servicio de comentarios notificó anteriormente:
410: el token de dispositivo ya no está activo para el tema.
Además, una nueva clave de datos JSON timestamp
estará en el cuerpo de la respuesta.
Si el valor del encabezado :status es 410, el valor de esta clave es la última ocasión en 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 esta sección se presentan los conceptos clave que rodean las notificaciones push en iOS. Explicó el rol del servicio Apple Push Notification Gateway (APNS). A continuación, se ha tratado la creación y el uso de los certificados de seguridad que son esenciales para APNS. Por último, este documento terminó con una explicación sobre cómo los servidores de aplicaciones pueden usar el Feedback Services para detener el seguimiento de los tokens de dispositivo expirados.