Hace unos días me enfrenté por segunda vez a la publicación de una aplicación en la App Store y, ha diferencia de la primera vez, esta aplicación implementaba un servicio APNS de Apple (Notificaciones PUSH para los nuevos).
Esta es mi vivencia y desahogo tras 2-3 días volviendo del curro y enganchándome al Mac a contrarreloj para intentar hacer funcionar el servicio de notificaciones de una aplicación lo antes posible.
Normalmente, al pasar una aplicación de modo desarrollo a producción, hay que generar certificados de distribución y cambiar los de desarrollo por estos últimos. Sin embargo, cuando trabajas con APNS, además, hay que activar el servicio APNS para producción (con sus certificados adicionales correspondientes) por lo que la cosa se complica un poquito más y de tener el servicio funcionando sin ningún tipo de fallos, pasé a perder por completo las notificaciones en la aplicación.
De esto te das cuenta cuando por fin Apple ha aceptado tu aplicación en la App Store ya que no hay forma de probar la aplicación de producción sin subirla antes a la App Store. Por tanto, he pasado estos días con los ojos clavados en mi Macbook Pro buscando solución a mi defectuoso servicio.
En internet encuentras muchas soluciones diferentes pero ninguna hacía que mi servidor PUSH volviera a funcionar. Lo que más me ha llamado la atención es que parece que la mayoría de los desarrolladores desarrollan por hobbie y no terminan de publicar la aplicación. Es curioso ver que la mayoría de las preguntas y dudas que encuentras están enfocadas a problemas en modo de desarrollo pero cuando estás en producción, la información pasa a escasear.
Volviendo a lo que toca, hace varios meses (casi un año ya), cuando comencé con el desarrollo de esta aplicación y me tocaba implementar las notificaciones PUSH, me topé con dos alternativas: la librería java-apns de notnoop y la librería javapns.
Como las diferencias no eran muy grandes para el punto en el que me encontraba, opté por java-apns cuyo código era mucho más sencillo.
Por aquel entonces, nos costó mucho hacerlo funcionar en el servidor porque no dábamos con la ruta en la que colocar el .JAR, no conseguíamos compilar nuestro servidor con dependencias y tampoco sabíamos dónde colocar el certificado que habíamos generado para las notificaciones PUSH en modo de desarrollo.
Por si alguien tiene la misma duda, los .JAR en un servidor con Glassfish hay que colocarlos en una ruta similar a esta:
/usr/share/glassfish3/glassfish/domains/domain1/lib/
Y los certificados (como por ejemplo Certificados.p12) y keystores para HTTPS aquí:
/usr/share/glassfish3/glassfish/domains/domain1/config/
Una vez dimos con ello, funcionó sin ningún problema hasta el día que subí la aplicación a producción.
Durante el primer día con la aplicación ya en la App Store y el servicio de notificaciones de la misma K.O., conseguí avanzar e ir puliendo errores que no voy a explicar puesto que no llegué a hacerla funcionar y la explicación iría en balde.
Muy quemado por la situación, el segundo día decidí ponerme a investigar la otra alternativa que consideré en su día para servidores con Java: javapns.
En aquel momento me percaté que javapns, a día de hoy, es mucho más utilizada y recibe actualizaciones más frecuentemente (por no decir que java-apns quedó estancada). Otra ventaja de esta librería es que puedes activar un Log que va trazando qué hace en cada momento que envía un PUSH y, por tanto, es más fácil de localizar posibles problemas.
La cuestión es que en local, con Java 6, en seguida conseguí ponerlo en marcha. Sin embargo, el servidor lo tenemos implementado con Java 7 y Netbeans en Mac OS X no se lleva bien con Java 7. Por tanto, compilar me resultaba toda una hazaña y cada vez que intentaba añadir un .JAR externo al proyecto, dejaba de compilar.
Al final, al tercer día de desesperación, decidí virtualizar Windows 7 en mi Mac e instalar Netbeans y Java 7. No fue sencillo puesto que Netbeans no quería instalarse, se quejaba porque no tenía acceso a \\vmware\share folders\ pero conseguí dar rápidamente con una respuesta en internet: «desactiva las carpetas compartidas en VMWare».
Tras varias horas y como ya tenía bastante mascado el código de los días anteriores, conseguí hacerlo funcionar.
A todo esto, os dejo la aplicación responsable de estos últimos días: