iphone - presion - ¿Cómo puede una aplicación iOS mantener viva una conexión TCP indefinidamente mientras está en segundo plano?
transferir datos de android a iphone (4)
Una aplicación de iPhone que se conecta a un servidor remoto a través de TCP. Los escenarios de uso son:
- la aplicación (usuario) envía datos al servidor y el servidor responde los datos.
- el servidor puede enviar datos a la aplicación mientras no hace nada.
Suponga que si la aplicación no envía datos al servidor durante 30 minutos, el servidor cerrará la conexión. Quiero mantener la conexión activa durante 120 minutos, incluso si el usuario no hace nada.
Caso 1: si la aplicación está en primer plano, puedo usar el temporizador para enviar algunos datos de no hacer nada al servidor. No hay problema.
Caso 2 : si el usuario presionó Inicio y la aplicación se fue al fondo, ¿qué podría hacer? No quiero mostrar alerta o algo para interrumpir al usuario (está ausente o jugando juegos). Solo quiero mantener la conexión activa durante un período más largo y cuando el usuario vuelve a la aplicación, descubre que la conexión seguirá viva y que estará contento con eso.
He leído documentaciones sobre la ejecución en segundo plano, la multitarea y las notificaciones locales de las API de iPhone. No estoy seguro si puedo lograr el Caso 2 .
Solo use APIs legales, sin jailbreaking.
Eche un vistazo a la Implementación de una aplicación VoIP en la Guía de programación de aplicaciones para iOS de Apple. Esta no es una solución probada, pero creo que se puede usar para lograr lo que está pidiendo.
Implementando una aplicación de VoIP
Una aplicación de Voz sobre protocolo de Internet (VoIP) permite al usuario realizar llamadas telefónicas utilizando una conexión a Internet en lugar del servicio celular del dispositivo. Tal aplicación necesita mantener una conexión de red persistente a su servicio asociado para que pueda recibir llamadas entrantes y otros datos relevantes. En lugar de mantener las aplicaciones de VoIP despiertas todo el tiempo, el sistema les permite suspenderse y proporciona instalaciones para monitorear sus sockets. Cuando se detecta tráfico entrante, el sistema despierta la aplicación VoIP y le devuelve el control de sus enchufes.
No estoy seguro si está desarrollando una aplicación de VoIP, pero podrá acceder a los enchufes y reaccionar en los paquetes entrantes. El texto después de la cita se refiere a [setKeepAliveTimeout:handler:][2]
que le permite establecer un bloque de código que le permite mantener viva una conexión (su VoIP). Sin embargo, el tiempo mínimo de programación es de 10 minutos.
En Implementing a VoIP Application es un párrafo sobre la instalación de un controlador Keep-Alive . Tengo curiosidad si esto ayudará. Por favor, danos una nota si esto resuelve tu problema.
Para cuando la aplicación está en primer plano:
Mire STOMP http://stomp.codehaus.org/Protocol
El marco STOMP en Obj-C http://code.google.com/p/stompframework/
y el intermediario ActiveMQ http://activemq.apache.org/
Cuando la aplicación está en segundo plano, probablemente usaré APNS (Notificaciones) para solicitar al usuario que vuelva a activar la aplicación ...
1. Cree su socket con propiedad VOIP como esta
[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
2.Añadir el modo de fondo requerido como "La aplicación proporciona servicios de Voz sobre IP" en la aplicación.plist
Si su aplicación está en modo de fondo, el zócalo VoIP no se cerrará. Usando este socket con notificación uilocal puedes obtener.
"Si su aplicación no es una aplicación de voip original, la tienda de aplicaciones rechazará"
Tapbots resolvió este problema con Pastebot al pedirle al usuario que ejecute una pista de audio silenciosa en todo momento.
Tenga en cuenta que Apple no usa ataques como el audio de fondo o las API de VOIP para mantener abiertas las aplicaciones de audio o VOIP (como lo demuestra la ''solución'' descrita en el artículo anterior), por lo que incurrir en estas técnicas arriesga el rechazo en el momento del envío.
Lamentablemente, sin embargo, no existe una API legal para mantener viva una conexión en segundo plano. Tal vez lo introduzcan en una futura actualización de iOS, pero puede considerar enviar una solicitud de función para expresar su apoyo.