iPhone GPS en el fondo nunca se reanuda después de la pausa

Mi aplicación necesita rastrear los cambios de ubicación del usuario en segundo plano y funciona bien siempre que el usuario se mueva. Cuando el usuario se detiene y CLLocationManager hace CLLocationManager pausa después de 10-20 minutos más o menos. Está indicado por esta notificación:

 -(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{} 

Y esto también está bien conmigo. Genial, guardo algo de batería, etc.

El problema es que CLLocationManager nunca se despierta cuando el usuario comienza a moverse nuevamente y los siguientes métodos delegates nunca se activan hasta que pongo mi aplicación en primer plano (se activa):

 //Never called back after CLLocationManager pauses: -(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{} -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 

¿Por qué nunca se llama a locationManagerDidResumeLocationUpdates vez que el dispositivo comienza a moverse nuevamente? ¿No debería el GPS reanudarse automáticamente también (ya que se pausó automáticamente)? ¿Hay alguna forma de reanudar el GPS sin la interacción del usuario?

La aplicación ha declarado lo siguiente en el archivo Info.plist:

enter image description here

Y mi configuración de CLLocationManager es:

 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setActivityType:CLActivityTypeFitness]; //I WANT pauses to save some battery, etc... That is why following line is commented out (default) //[locationManager setPausesLocationUpdatesAutomatically:NO]; locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters; locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; [locationManager startUpdatingLocation]; 

Si busca pausesLocationUpdatesAutomatically en los foros de Apple, encontrará una pregunta reciente a lo largo de líneas similares que ha tenido una respuesta de un desarrollador de Apple. No lo volveré a publicar aquí directamente, ya que es un foro privado, pero la esencia es que la pausa de ubicación es para casos en que el usuario se olvida de que tiene una aplicación de ubicación consciente en ejecución y ha dejado de usarla. Al pausar las actualizaciones, su batería no se agotará tan rápido. Lamentablemente, no es posible saber si los nuevos movimientos son reanudar la actividad o hacer otra cosa, por lo que las actualizaciones no se reanudan hasta que la aplicación vuelve al primer plano. Su sugerencia es captar la llamada de pausa y obtener de algún modo la atención del usuario para que abran la aplicación si aún desean actualizaciones.

EDITAR:

De la propia documentación de Apple de pausasLocationUpdatesAutomatically . Ellos sugieren:

Luego de una pausa, es su responsabilidad reiniciar nuevamente los servicios de ubicación cuando determine que son necesarios. Core Location llama al método locationManagerDidPauseLocationUpdates(_:) del delegado del administrador de su ubicación para informarle que se ha producido una pausa. En ese método, puede configurar una notificación local cuyo desencadenante sea del tipo UNLocationNotificationTrigger y esté configurado para notificar cuando el usuario sale de la región actual. El mensaje para la notificación local debe solicitar al usuario que inicie su aplicación nuevamente para que pueda reanudar las actualizaciones.

El documento de Apple es muy débil sobre ese tema. propiedad pausesLocationUpdatesAutomatically permite que Apple cierre el GPS cuando Apple piensa que el usuario no necesita GPS.

Aunque no está documentado, parece que establecer esta propiedad conduce a una parada del GPS en modo de fondo.

Varias publicaciones describen los problemas con esa propiedad: por ejemplo, aquí:
iOS 6 CoreLocation no funciona

En iOS 6 AutoPause no funciona Stanislav Dvoychenko publica la recomendación de Apple:

[Actualización – 4-Mar-2013]. Revisé la presentación de Apple para ver los cambios de ubicación en iOS6 y me sugirieron utilizar la supervisión de cambios de la región para “cancelar la pausa” una vez que se produzca el evento de cambios en la región. Aunque esto no es adecuado para mis escenarios, ya que el usuario podría ir / correr / conducir durante un kilómetro o dos hasta que ocurra tal evento.

Sugiero: establecer esa propiedad en falso.

Si puede, use startMonitoringSignificantLocationChanges porque entonces (Apple):

Si inicia este servicio y su aplicación se cancela posteriormente, el sistema relanza automáticamente la aplicación en segundo plano si llega un nuevo evento.

Puede intentar combinar esto con un seguimiento más detallado cuando su aplicación se active (por ejemplo, el usuario vuelve a ingresar).