2012-09-05 16 views
5

Tengo una aplicación iOS 5.1 que se registra en el servicio APNS para recibir notificaciones. El registro es exitoso y recibo las notificaciones correctamente. El problema surge cuando trato de manejar las notificaciones.¿Cómo puedo manejar las notificaciones push no leídas en iOS?

Una vez que la aplicación se está ejecutando, el método didReceiveRemoteNotification en el AppDelegate se llama correctamente y la notificación se maneja según lo previsto. Sin embargo, esto solo ocurre cuando la aplicación se ejecuta en primer plano.

Sin embargo, cuando la aplicación se ejecuta en segundo plano o simplemente se detiene, no se llama a ese método. He leído que debe agregar algunas líneas al método didFinishLaunchingWithOptions para obtener la notificación del diccionario userInfo y manejarlo. Esto funciona bien, pero SÓLO cuando la aplicación se abre haciendo clic en la notificación en el Centro de notificaciones. Esto significa que si abre la aplicación haciendo clic en su insignia, o simplemente cambiando el contexto si la estaba ejecutando en segundo plano, la aplicación nunca se da cuenta de que se recibió una notificación. Además, si recibió más de una notificación, podemos solo maneja uno de ellos a la vez haciendo clic en el Centro de notificaciones, que es un problema :-)

¿Hay alguna forma de leer las notificaciones pendientes en el Centro de notificaciones? Sé que hay una forma de eliminarlos usando el método cancelAllLocalNotifications, pero no he encontrado la manera de leerlos. Y realmente necesito manejarlos a todos. Pensé en implementar un protocolo de comunicación con el servidor de notificación de terceros para recuperar la información nuevamente cuando la aplicación salga a primer plano, pero como la información ya está en el sistema operativo, me resultaría extraño si es imposible acceder a ella de alguna manera.

Entonces, ¿alguien sabe una manera de hacerlo? Gracias por adelantado.

Respuesta

3

Cuando llega una notificación de inserción y el usuario hace clic en 'cancelar', su aplicación no tiene forma de volver a leer esa notificación de inserción. Debe implementar una funcionalidad separada (muy probablemente en el lado del servidor) para obtener una lista de notificaciones enviadas a este dispositivo.

Por ejemplo, si se proporciona una funcionalidad de chat en su aplicación y envía mensajes de chat a través de notificaciones automáticas, también debe mantener los mensajes de chat en el servidor. Si un usuario hace clic en "Cancelar" en cualquier notificación de inserción, ese mensaje de chat no se mostrará en el dispositivo iOS. En ese caso, cuando una aplicación aparece en primer plano más adelante, realiza una llamada al servidor y busca todos los mensajes de chat pasados ​​(enviados a través de notificaciones automáticas).

+0

Lo que es cierto es que no se garantiza que lleguen las notificaciones automáticas. Quizás estoy perdiendo el tiempo tratando de leerlos del servicio de notificación, porque tampoco puedo estar seguro de que contenga toda la información que quiero. De todos modos, necesito saber si hay una manera de hacerlo, antes de descartar cualquier solución ... – Bartserk

+0

Estás en lo correcto. Hasta donde yo sé, no hay otra solución más que ir a buscar desde el lado del servidor. –

1

Ok, Entonces, ¿una posible solución sería tener otra tabla de base de datos con los mensajes con un indicador 'leer' y un campo messageID? Que por defecto la bandera de lectura es NO, cuando la aplicación lee esto y muestra correctamente, ¿actualiza la bandera a SÍ?

Y con solo 256 bytes para jugar, ¿qué tipo de longitud de campo de ID sería necesaria?

Editar,

ejecutado este plan y su trabajo con éxito.

+0

Sí, es una buena solución :) También puede relacionar ese mensaje con una tabla de "usuario", y de esta manera puede crear un valor agregado para verificar cuántos mensajes no leídos tiene el usuario.Y, utilizando ese valor, puede actualizar una viñeta con seguridad, que era mi principal preocupación en aquel momento cuando escribí la pregunta. En cuanto a la identificación, un buen valor numérico antiguo de 32 bits debería ser suficiente, a menos que maneje una gran cantidad de información :) – Bartserk

+0

He utilizado el token de aplicaciones y una identificación de mensaje como forma de comparar mensajes, esto significa que puedo solo use una identificación corta, y la ficha debería ser suficiente para detener las colisiones. –

+0

Tengo que decir que el uso del token de la aplicación como id no se recomienda en la documentación. Aunque funciona, más o menos, el token de la aplicación es más volátil de lo que parece en iOS. Podría cambiar, por ejemplo, con una actualización del sistema operativo o un restablecimiento de fábrica. Deberías considerar generar algún otro tipo de identificación relacionada con el dispositivo. – Bartserk

Cuestiones relacionadas