Usando APNs (Apple Push Notification services) desde .Net


En este artículo veremos cómo enviar notificaciones, usando el Servicio de Notificaciones Push de Apple(APNs), desde una aplicación desarrollada en .Net Es más bien un resumen de la guía publicada por arashnorouzi. La cual hace uso de la librería Moon-APNS que nos permite de forma muy sencilla enviar las notificaciones push.
¿Qué son las notificaciones push?
Las notificaciones son mensajes cortos que se dividen básicamente en dos partes, una que permite identificar y localizar el dispositivo en el que se ha instalado nuestra aplicación (DeviceToken) y otra que especifica cómo debe ser notificado el usuario que tiene instalada nuestra aplicación en su dispositivo (PayLoad).

DeviceToken: es una cadena de 64 caracteres que nos permite identificar el dispositivo que tiene instalada nuestra aplicación y para el cuál será enviado el mensaje de notificación. Este valor es generado por el Centro de Notificaciones una vez que la aplicación es instalada en un dispositivo.

Un ejemplo puede ser algo como esto:

c9d4c07cfbbc26d6ef87a44d53e169831096a5d5fd82547556659dddf715defc
nota: En el artículo original viene separado por espacios en blancos pero la forma correcta de usar el token es sin espacios.

PayLoad: Es una estructura JSON que contiene básicamente los siguientes atributos:
-      Message: La cadena de texto del mensaje que será visualizado en el dispositivo.
-      Badge: Indica el número de secuencia del mensaje. Y es visible como una insignia en el Icono de nuestra aplicación en el dispositivo.
-      Sound: El identificador del sonido que acompañara al mensaje en el momento de ser visualizado en el dispositivo.

¿Cómo podemos usar el servicio?

Apple requiere para poder usar el servicio un certificado SSL que nos permitirá garantizar la seguridad del envío de nuestros mensajes a través de la red. Para generar el certificado en MAC podemos ver Generating the Apple Push Notification SSL certificate on Mac en él se explica claramente cómo debemos hacerlo.

Una vez que hemos obtenido nuestro certificado y nuestra clave privada procedemos a instarla en la máquina donde tenemos nuestra aplicación .Net. Ver APNS Certificates Registration on Windows

Una vez instalado el certificado podemos crear en Visual Studio un pequeño proyecto de prueba con la referencia a la librería Moon-APNS. Por ejemplo una aplicación de consola donde incluyamos el siguiente código:


//Construimos el PayLoad // var payload1 = new NotificationPayload("DeviceToken","Message",Badge,"Sound"); var payload1 = new NotificationPayload("ee8c3ebce9fb41155bd75d081e76ec46ab45c3b4cc012142723f62152eb13daa", "Has recibido esto", 1, "default"); //La libreria permite enviar una lista de notificaciones var p = new List<NotificationPayload> { payload1 }; //Creamos un PushNotification para enviar las notificaciones // var push = new PushNotification(use sandbox, "P12File location","password"); var push = new PushNotification(true, "aps_developer_identity.p12", "xxxxxxx"); //La libreria nos permite crear una lista que nos informa de los PayLoad que han sido rechazado. var rejected = push.SendToApple(p); foreach (var item in rejected) { }

nota: Es importante abrir el Puerto 2195 en nuestro firewall es requerido para poder conectar con el servicio.

9 comentarios:

  1. Hola Manuel, implemente esta librería para el envío de notificaciones a iphone pero me saca el error "No se pudo realizar una llamada a SSPI; consulte la excepción interna."

    Creo que es el certificado estoy utilizando un archivo pa.pem y en tu ejemplo veo que utilizas un .p12 le agradezco cualquier información al respecto.

    Saludos,

    ResponderEliminar
  2. Hola Andrés,

    Ese error casi siempre tiene que ver con problemas del certificado. Si, según la documentación debes exportar desde el Keychain Access tu certificado en formato .p12 e instalarlo en tu entorno, en la entrada hay enlaces que explican como hacerlo.

    Espero te sirva de ayuda y gracias por comentar.

    Saludos,

    ResponderEliminar
  3. Hola, efectivamente necesitaba el certificado en formato .p12, el archivo .pem original fue convertido a .p12 con la herramienta Cygwin, ahora tengo una duda con los conceptos feedback y sandbox, muchas gracias por tu colaboración

    ResponderEliminar
  4. hola, y porque no pones un ejemplo sin usar el moon-apns, sería más limpio y menos dependiente para el resto de la humanidad (lo digo así porque estoy harto de ver que todos los tutoriales de este tema son iguales)

    saludos.

    ResponderEliminar
  5. Hola Anónimo,

    Moon-APNs es una librería de código abierto que nos facilita el trabajo para poder enviar notificaciones desde la plataforma .Net, no creo que exponer un ejemplo sin usar esta librería sería más limpio. Lo de la "dependencia" que no lo como tal, ya que cualquiera puede implementar su propia librería, es porque efectivamente existen muy poca documentación y desarrollo para este tema en .Net

    Gracias por comentar.

    Saludos,

    ResponderEliminar
  6. que onda amigo fíjate que tengo un error me dice que la cadena de entrada no tiene el formato
    correcto alguien tiene alguna sugerencia.

    ResponderEliminar
  7. Hola Manuel.

    Una duda, ya tengo implementado todo, pero aun no puedo hacer que me responda, además de que tengo un problema en como hacer el despliegue a mi Ipad, sin embargo, mi duda es ¿ Debo incluir en el código de mi Ipad un mecanismo para aceptar y mostrar la notificación?
    Saludos y Gracias por el Aporte!

    ResponderEliminar
  8. Hola Manuel,
    He realizado el proceso de envío de notificaciones de ambas formas, usando Moon-Aps y con mi propío código, pero en ambas recibo la misma respuesta que al parecer va relacionada con la autenticación de mi archivo p12:

    System.IO.IOException: Error de autenticación porque la parte remota cerró la secuencia de transporte.
    en System.Net.Security.SslState.CheckThrow(Boolean authSucessCheck)
    en System.Net.Security.SslState.get_SecureStream()
    en System.Net.Security.SslStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback asyncCallback, Object asyncState)
    en MoonAPNS.PushNotification.SendQueueToapple(IEnumerable`1 queue)
    en MoonAPNS.PushNotification.SendToApple(List`1 queue)
    en notificaciones.regId.SEND_NOTIFICATION(String regId, String mensaje, Int32 plataforma) en c:\Users\Diego\Desktop\notificaciones\notificaciones\notificaciones\WS_funciones.asmx.cs:línea 100

    En donde la línea 100 es la siguiente var rejected = push.SendToApple(p)

    He verificado mi password del archivo p12 y todo parece estar bien, ya abrí mi puerto 2195, tengo la aplicación corriendo en mi ipad e incluso me devuleve el token a la perfección, ya tengo mi función APN para recibir la notificación (estoy trabajando con phonegap) pero en la parte de servidor tengo obtengo éste gran error. Alguna sugerencia?

    ResponderEliminar