Servicio en segundo plano a tiempo completo de iOS basado en el seguimiento de la ubicación

Actualmente estoy escribiendo una aplicación que depende del seguimiento de la ubicación y el envío de datos sobre la posición al servidor. Sin embargo, el problema es que tiene que funcionar las 24 horas del día, los 7 días de la semana y actualmente estoy experimentando bloqueos aleatorios que ocurren cada 2 o 3 días. Lo que he hecho para que la aplicación se ejecute constantemente en segundo plano es colocar un NSTimer en un método beginBackgroundTaskWithExpirationHandler justo al lado del método applicationDidEnterBackground. El temporizador se ejecuta cada minuto y detiene/inicia el servicio de ubicación.

Aquí hay un registro de bloqueo de muestra

El código básicamente se ve así:

UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTaskId = 0;

bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES];
    [t fire];

    if (bgTaskId != UIBackgroundTaskInvalid){
        [app endBackgroundTask: bgTaskId];

        bgTaskId = UIBackgroundTaskInvalid;
    }
}];

Estoy utilizando GCDAsyncSockets para fines de conexión, cada llamada tiene un tiempo de espera de aproximadamente 30 segundos.

Realmente no tengo ideas, ¿cuál podría ser la razón por la que ocurren los bloqueos?

preguntado el 22 de mayo de 12 a las 17:05

desarrollador.apple.com/library/IOs/#documentation/iPhone/… Este enlace es el documento para la multitarea y el material de fondo. Podría contener la información que todos buscamos. -

Sí, hice esto en una aplicación una vez, es posible que desee usar NSRunLoopCommonModes para su temporizador:

¿Ha mirado la sesión de WWCD 2010 "Uso de la ubicación principal en iOS 4" y la aplicación de muestra asociada "Breadcrumbs"? desarrollador.apple.com/videos/wwdc/2010 Describen cómo usar Core Location mientras está en segundo plano sin usar ningún truco de temporizador. -

1 Respuestas

Es probable que su temporizador se esté disparando DESPUÉS de que se invalide la tarea (después de [UIApplication sharedApplication].backgroundTimeRemaining llega a 0.

La cosa es que tu no puedes hacer que la aplicación se ejecute constantemente en el fondo. Si desea ejecutar código de vez en cuando, su única opción será usar la API de ubicación en segundo plano, configurando que su aplicación esté usando el localidades modo de fondo en su plist. estarías obteniendo la CLLocationManagerDelegate devoluciones de llamada, y usted tiene algun tiempo para hacer algo de trabajo cuando se llama a esos métodos.

Consulte la documentación de Apple sobre los modos en segundo plano: http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

Y el manual de reconocimiento de ubicación: http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497

Respondido el 01 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.