Ubicación del usuario en segundo plano cuando la aplicación se termina o se suspende

He estado tratando de averiguar cómo get la location del usuario cuando la aplicación termina, como la forma en que la aplicación Moves lo hace. La única manera que sé de hacerlo es con cambios significativos de location. Sin embargo, con cambios de location significativos, la aplicación solo se despierta cada 500 metros y solo si han pasado 5 minutos después de la última actualización.

De acuerdo con Apple:

Las aplicaciones pueden esperar una notificación tan pronto como el dispositivo se mueva 500 metros o más desde su notificación previa. No debe esperar notifications con más frecuencia que una vez cada cinco minutos. Si el dispositivo puede recuperar datos de la networking, es mucho más probable que el administrador de la location entregue notifications de manera oportuna.

En la aplicación Moves, incluso con la aplicación terminada, es capaz de recuperar la location del usuario con mucha precisión sin tener mucho drenaje de la batería. Tampoco parece tener activada la location de background, ya que la razón en la list de uso de la batería solo muestra "Actividad de background". Entonces me pregunto cómo hace una aplicación como Moves. Cualquier ayuda sería genial! Gracias.

En caso de que necesite actualizaciones de location con frecuencia, pero desea conservar la vida de la batería, intente esto,

  1. Agregue los permissions necesarios para usar la location en segundo plano.
  2. Inicie las actualizaciones usando startUpdatingLocation
  3. Comience a aplazar las actualizaciones cuando allowDefernetworkingLocationUpdatesUntilTraveled:timeout: en segundo plano utilizando allowDefernetworkingLocationUpdatesUntilTraveled:timeout: especifique los filters de time y distancia en este método.
  4. Asegúrese de leer los documentos aquí y especifique todas las properties correctamente para que funcione.

Puede registrarse en regiones en un área de 500m y registrarse en la notificación de región de notificación en ellas. Cuando llega a uno si es así, su aplicación se inicia en segundo plano. Luego, vuelva a registrarse para otros nuevos manteniendo esa location en el centro.

introduzca la descripción de la imagen aquí

De la documentation de Apple :

Las aplicaciones que admiten la ejecución en segundo plano pueden ser relanzadas por el sistema para manejar los events entrantes. Si una aplicación termina por cualquier motivo que no sea la fuerza de usuario que lo abandona, el sistema inicia la aplicación cuando ocurre uno de los siguientes events:

Para aplicaciones de location:

  • El sistema recibe una actualización de location que cumple con los criterios configurados para la entrega de la aplicación.

  • El dispositivo ingresó o salió de una región registrada. (Las regiones pueden ser regiones geográficas o regiones de iBeacon).

La única solución es utilizar el modo de background con CoreLocation. Si su aplicación requiere iOS 8, el sistema reiniciará su aplicación, incluso si la fuerza es abandonada por el usuario. Esto está documentado en Apple Docs :

En la mayoría de los casos, el sistema no reinicia las aplicaciones después de que el usuario las obliga a abandonar. Una exception son las aplicaciones de location, que en iOS 8 y posteriores son relanzadas después de que el usuario las abandone. Sin embargo, en otros casos, el usuario debe iniciar la aplicación explícitamente o reiniciar el dispositivo antes de que la aplicación pueda iniciarse automáticamente en segundo plano por el sistema.

en iOS 8 son nuevos pasos a los que debemos prestar atención para hacer que funcione la búsqueda de la location. El primer paso es agregar una o dos keys en el file .plist del proyecto dependiendo de la funcionalidad principal de la aplicación. Las dos keys son NSLocationWhenInUseUsageDescription y NSLocationAlwaysUsageDescription, entonces necesitará agregar una cadena que explica al usuario por qué la aplicación necesita acceder a su location, algo entre las líneas de "Esta aplicación usa la location en segundo plano / primer plano debido a A, B y C ". Cada una de estas cadenas tiene un método de autorización correspondiente que debe llamarse, WhenInUse o Alway (es decir, Antecedentes).

 - (void)startStandardUpdates { // Create the location manager if this object does not // already have one. if (nil == locationManager) locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.desinetworkingAccuracy = kCLLocationAccuracyKilometer; // Set a movement threshold for new events. locationManager.distanceFilter = 500; // meters [locationManager startUpdatingLocation]; } 

De mi experiencia actual, tienes 3 opciones para que esto funcione. El primero es tener una notificación silenciosa que requiere un esfuerzo hecho por el backend. La notificación silenciosa es una especie de notificación de inserción pero notifica a su aplicación sin una alerta. La segunda solución es búsquedas de antecedentes. Las búsquedas de background no requieren una solución de backend, pero lamentablemente no puedes controlar los intervalos necesarios para instanciarlo. El tercero tiene notifications locales progtwigdas sin posts.

De los documentos

Seguimiento de la location del usuario

Existen varias forms de rastrear la location del usuario en segundo plano, la mayoría de las cuales en realidad no requieren que su aplicación se ejecute de forma continua en segundo plano:

 The significant-change location service (Recommended) Foreground-only location services Background location services 

Ejecución de background

Y para los detalles: Obtener la location del usuario