Chat basado en socket de iOS, ¿cómo recibir posts que se enviaron cuando la aplicación está en segundo plano?

Por diversión, he creado una pequeña aplicación de chat basada en socket. Habla sobre el socket tcp con un server nodejs. Envía exitosamente posts de ida y vuelta. Sin embargo, el problema ocurre cuando presiono el button de inicio y pongo mi aplicación en segundo plano; en este punto, el socket parece estar "en pausa" y todos los posts que se envían durante este time se pierden.

Tengo la configuration de notifications push para cuando la aplicación está en segundo plano, pero como el socket no está activo en la aplicación, el post nunca llega a la aplicación.

¿Cómo debería manejar esto? ¿Cuáles son mis opciones? Tengo algunas ideas, pero me encantaría que aportes aquí sobre cómo las personas manejan esto.

Mis ideas:

  1. Agregue un método "loadHistory" en mi server nodejs que envía todo el historial de un canal. Para que mi aplicación pueda llamar a cierta URL y get una respuesta formada JSON con todos los posts. ¿Tal vez esto debería hacerse cada vez que se toca un elemento de la table?

  2. ¿Hacer uso de las nuevas características de ejecución en segundo plano iOS7? (No estoy seguro de que sea posible mantener vivo el socket con eso)

  3. Implemente una manera para que el server sepa si un post ha sido entregado, si no pudiera ser entregado, almacenará el post en la database. Tan pronto como el cliente vuelve a conectarse, envía los posts a través de tcp. Esto requeriría una gran cantidad de funciones adicionales para el server, por lo que le recomendamos evitar esto si es posible.

si desea un post sin connection, se necesita la tercera vía, para cada post que reciba, debe enviar una notificación al server para indicarle que se entrega el post, y cuando se conecte, debe search el post perdido.

Podrías usar voip, pero tu aplicación no puede recibir posts si la mataron. (si agrega el modo voip pero su aplicación no se trata de voz, apple bloqueará su aplicación)

También he hecho algunos trabajos sobre el socket TCP. Di apoyo de background con estos pasos:

  1. Agregue la tecla "Modos de background necesarios" en su file Plist.

    introduzca la descripción de la imagen aquí

  2. Agregue este código en su file AppDelegate.m

    - (void)applicationDidEnterBackground:(UIApplication *)application { #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 40000 if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [[UIDevice currentDevice] isMultitaskingSupported]) { NSLog(@"Keep timeout alive"); [application setKeepAliveTimeout:600 handler: ^{ NSLog(@"applicationDidEnterBackground:: setKeepAliveTimeout:handler^");//task as you want to do }]; } #else LogInfo(@"applicationDidEnterBackground (Not supported)"); #endif } 
  3. Cuando obtenga su object de socket de lectura y escritura CFStream después de una connection TCP exitosa, agregue este código

     CFReadStreamSetProperty(yourCFReadStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); CFWriteStreamSetProperty(yourCFWriteStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 

Después de seguir estos pasos, su socket debería recibir un post en segundo plano y la connection estará activa hasta el momento en que entregue "applicationDidEnterBackground".

Espero que esto sea de ayuda. Gracias