2011-03-22 8 views
17

Estoy trabajando en una aplicación que supervisa cambios significativos de ubicación en segundo plano. He estado leyendo todas las respuestas (bueno, ¡creo todo!) Sobre ios4 y el ciclo de vida de la aplicación, pero lo que no puedo entender es si puedo o no acceder a la red cuando la aplicación se despierta en segundo plano. como resultado de un cambio de ubicación significativo.¿Se puede activar la aplicación de iPhone en segundo plano para cambiar la ubicación de manera significativa la actividad de la red?

La aplicación actualmente tiene acceso a la red a través de sockets TCP. El socket se apaga cuando la aplicación se suspende.

¿Puedo volver a conectar el zócalo, recibir algunos datos, enviar la nueva ubicación y luego cerrar el zócalo mientras todavía está en segundo plano como resultado de recibir el evento de cambio de ubicación? ¡Es difícil probarlo mientras está parado en la oficina! Podemos suponer que la actividad de la red tarda menos de 10 segundos en completarse. Supongamos también que la aplicación no está registrada como aplicación de VoIP (¿podría/debería ser? ...)

¿Alguna idea?

Respuesta

11

Yep. Puede hacer su procesamiento de red basado en eventos de cambio significativos.

Cuando se despierta en el estado de fondo en un cambio significativo (desde el estado finalizado o suspendido), puede realizar su solicitud http. Si descubre que su aplicación se cerrará antes de que finalice su solicitud HTTP, puede solicitar un tiempo adicional de procesamiento en segundo plano a través del método beginBackgroundTaskWithExpirationHandler: en la aplicación UIA.

Pasé un poco de tiempo en viajes cortos en tren para probar esto. :)

+0

Gracias RBT, eso suena concluyente. – Roger

+1

Puede ser posible desde un punto de vista técnico. ¿Pero Apple lo permite? ¿Su aplicación (usando esta técnica) ha sido aprobada realmente? – Toastor

+1

@Toastor Sip. De hecho, fue un empleado de Apple en los foros que también lo sugirió. – RedBlueThing

4

Me gustaría confirmar la respuesta de RedBlueThing con algunos detalles.

Ahora uso lo siguiente para lograr esto. bgTask se declara como UIBackgroundTaskIdentifier

bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: 
      ^{ 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
      }]; 

// Now call methods doing network activity 
// ... 
// WHEN I KNOW THE LAST ACTION HAS COMPLETED USE THIS BLOCK OF CODE 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
} 

Espero que esto ayude a cabo ya que veo un buen número de personas que buscan en la pregunta.

+0

Roger, ¿cómo implementó sus llamadas de red? Estoy luchando para enviarlos en segundo plano, http://stackoverflow.com/questions/12463091/ios-background-location-not-sending-http-request –

Cuestiones relacionadas