7

Estoy trabajando en una aplicación de mensajería y tengo un dilema sobre cómo enviar datos del servidor al cliente.¿Puede la mensajería de servidor a cliente depender de APNS?

Estoy usando un diseño de servidor centralizado, donde los clientes usan NSURLConnection para enviar mensajes al servidor, el servidor no guarda y administra los sockets abiertos y no puede enviar un mensaje para uno de los clientes. Entonces los clientes usan un temporizador y consultan el servidor cada 2 segundos para ver si hay nuevos datos esperándolos.

El problema con este enfoque es que el sondeo del servidor cada 2 segundos parecen matar a la batería muy rápido, así que pensé que tal vez de los clientes de votación el servidor, a uso APN * por lo que cuando el servidor tiene alguna nueva información ** para el cliente, el servidor enviará una notificación de inserción * ** al cliente, luego el cliente obtendrá los datos del servidor.

* use APNS - si el cliente lo permite, el cliente puede desactivar esta opción. Por lo tanto, verificaré si se permite la inserción cada vez que la aplicación ingrese en primer plano y, de no ser así, volveré al método de votación.

** Nueva información puede ser cualquier cosa, desde mensajes de texto hasta mensajes de administrador del servidor. (y hay muchos mensajes de administrador ...)
Por ejemplo, en mi aplicación, los usuarios pueden ver el estado de sus amigos (en línea/fuera de línea), por lo que si user1 y user2 son amigos, y user2 solo cambian su estado de online a fuera de línea, entonces el servidor debe enviar esta nueva información (mensaje de administrador = usuario2_abandono) a usuario1.

***Las notificaciones push servidor envía están vacías (sin datos/sonido), es sólo un disparador para el cliente para ir a buscar la nueva información, por lo que si un empuje se envía al cliente y la aplicación del cliente estaba cerca, él no notará nada. (si la aplicación se está ejecutando, obtendrá la nueva información del servidor)

¿Funcionará este enfoque con una aplicación de mensajería masiva que requiera notificaciones masivas?

Para ser más claros mis principales preocupaciones son: 1.
es lo suficientemente confiable que pueda usarlo como mi mecanismo de mensajería de servidor a cliente núcleo APN?
2. ¿Aprobará Apple potencialmente miles o cientos de miles de notificaciones automáticas por día desde mi servidor?

+0

Tenga una mirada en SocketIO (sondeo largo) antes de construir usted es dueño de los mecanismos de votación. – Till

Respuesta

-1

He trabajado en esta área por un tiempo y desde mi modesta experiencia creo que su enfoque para resolver sus problemas no llegará a ninguna parte. Permítanme primero resaltar algunos hechos importantes sobre las características de APN:

  1. Las APN no son confiables, no se garantiza al 100% que lleguen al cliente.
  2. A partir de la documentación de Apple, APN son mejor esfuerzo, tantas veces que pueden no alcanzar.
  3. Los APN no contienen datos dentro de ellos, por lo que incluso si llegan a la aplicación cliente no tienen nada dentro de ellos para la aplicación.
  4. Las APN son solo notificaciones para el usuario de que algo relacionado con su aplicación ha ocurrido, mientras que el mensaje (el texto que aparece en el Cuadro de alertas de la APN) es manejado por el iOS y no por su aplicación. Esta es la razón por la que los dispositivos con iOS 4 mostrarán el APN de una manera diferente que los dispositivos con iOS 5, es el trabajo del sistema operativo, no su aplicación.
  5. El valor de la insignia que aparece en el icono de su aplicación cuando se reciben notificaciones es responsabilidad del servidor y no del sistema operativo del dispositivo. Dicho de otro modo, cuando un APN llega al dispositivo, debe tener el nuevo valor de recuento de notificaciones para su aplicación. El sistema operativo no hará nada por esto.

Habiendo dicho esto, me gustaría explicarles un poco la frecuencia con que se diseñan tales aplicaciones. En primer lugar, no se realiza mediante las conexiones de URL y los clientes no verifican el servidor cada período de tiempo. Usualmente tiene una arquitectura de cliente/servidor donde su cliente es la aplicación en el dispositivo y el servidor es un programa de servidor real que reside en una máquina servidor. El servidor podría ser Microsoft (usando C# por ejemplo) o MAC (usando Objective C). El servidor tiene una base de datos que almacena información dentro de él. Alguna información importante (relacionada con su pregunta) es el valor de recuento de APN, el mensaje que desea entregar, el estado del cliente si está en línea o fuera de línea.

Cuando a un cliente le gusta enviar algo a otro cliente, o cuando el servidor desea enviar algo a un cliente (o al cliente), se realiza una comprobación para ver si está en línea o fuera de línea. Si está en línea, el mensaje se envía directamente y, por lo general, las comunicaciones se realizan en los sockets TCP. Si el usuario está desconectado, el servidor almacenará el mensaje que debe enviarse al cliente, aumentará el valor del conteo de APN y enviará un APN a ese destinatario. Cuando ese destinatario se conecta, el servidor se dará cuenta de que (porque hay una conexión y un protocolo de enlace) y obtendrá todos los mensajes no enviados de la base de datos y se los enviará ...

Es un proceso largo, espero Pude explicarte un poco las cosas. En todos los casos, no creo que su manera sea práctica o le permita alcanzar un trabajo real.

+0

En caso de que desee comenzar con el cliente/servidor utilizando sockets, le recomendamos que comience a leer desde [aquí] (http://stackoverflow.com/questions/10823544/iphone-communication-using-sockets/10824560#10824560) – antf

+2

"Las APN no contienen datos dentro de ellas, por lo que incluso si llegan a su aplicación cliente no contienen nada dentro de ellas para la aplicación". Eso no es correcto: puedes poner tu propia carga dentro (aunque hay un límite para el tamaño total de una APN) – Gruntcakes

+0

Primero gracias por tu respuesta, pero creo que hay un malentendido ... acerca de los hechos de APNS: (1,2) Sé que APNS es el mejor esfuerzo, el servidor puede verificar si el cliente recibió el empuje y si no, lo volverá a enviar. (3) Eso no es correcto, puedo enviar payload con él, pero este no es mi propósito, como escribí: "Los envíos del servidor de notificaciones push están vacíos (sin datos/sonido), es solo un desencadenante para que el cliente los busque. la nueva información "(4,5) Sé pero no es relevante para mis necesidades .. – Eyal

0

¿Es APNS lo suficientemente confiable como para usarlo como mi mecanismo central de mensajería de servidor a cliente?

NO. Solo por el hecho de estar completo, déjame repetir las razones.

  1. propia Apple se exime de la fiabilidad leyó el Programming Guide
  2. Además, APN, tiene un componente de calidad de servicio que puede aumentar la fiabilidad en el costo de ser en tiempo real (Por Ej. Puedo hacer APN para entregar la notificación en cualquier momento dentro 4 semanas y vuelva a intentar si los dispositivos no son alcanzables) que no es útil en su caso.
  3. Según su requisito, si envía un impulso silencioso (un impulso sin mensaje visible para el usuario), no se puede enviar como un impulso de ALTA prioridad, lo que reduce aún más la fiabilidad. Aquí hay una cita relevante

    "notificaciones Silent no pretenden ser una forma de mantener su aplicación despierta en el fondo, ni están pensados ​​para las actualizaciones de alta prioridad. APNs trata notificaciones silenciosos como de baja prioridad y puede estrangular su entrega si el número total es excesivo. Los límites reales de son dinámicos y pueden cambiar según las condiciones, pero intente no enviar más de unas pocas notificaciones por hora."

¿Apple apruebe potencialmente a miles o cientos de miles notificaciones push de un día de mi servidor?

En general, APN no tendrá ningún problema con esto en términos de carga, pero tiene aceleración en su lugar y pueden estrangular sus notificaciones, consulte el punto 3 anterior

En mi humilde opinión, debe mirar a XMPP ya que este protocolo está diseñado solo casos de uso como el suyo y tienen wi de apoyo de la comunidad en todas las plataformas. Sugeriré que vea algo como https://github.com/robbiehanson/XMPPFramework y configurará un servidor XMPP en su backend que manejará los mensajes y mensajes de presencia, así como también los de administrador.

Si ya ha evaluado XMPP y no quiere ir con él, le sugiero que necesite armar un sistema inteligente en la aplicación iOS que emplea diferentes estrategias basadas en el estado de la aplicación, algo como seguir, puede tener estrategias

  1. un enfoque basado en tiempo real socket -> Establecer una conexión de socket permanant y mantener los datos sincronizados tanto como sea posible (esto es cuando su aplicación se está ejecutando en primer plano o de fondo)
  2. El sistema de sondeo hablaste sobre en cuestión, que se puede utilizar cuando se invoca su aplicación para actualizaciones de localización/búsqueda de fondo, etc.
  3. Uso APN con los datos de usuario de mensajería visibles + personalizados, cuando el servidor detecta que el dispositivo no dispone de toma activa y tampoco han sondeado por un tiempo muy largo
Cuestiones relacionadas