Esta es la sección de la documentación de CLLocationManager que describe el comportamiento de la aplicación con startMonitoringSignificantLocationChanges :
Si inicia este servicio y su aplicación se cancela posteriormente, el sistema reinicia automáticamente la aplicación en segundo plano si llega un nuevo evento. En tal caso, el diccionario de opciones pasado a la aplicación: didFinishLaunchingWithOptions: método del delegado de su aplicación contiene la clave UIApplicationLaunchOptionsLocationKey para indicar que su aplicación se inició debido a un evento de ubicación. Al reiniciar, debe configurar un objeto de administrador de ubicación y llamar a este método para continuar recibiendo eventos de ubicación. Cuando reinicia los servicios de ubicación, el evento actual se envía a su delegado de inmediato. Además, la propiedad de ubicación de su objeto de administrador de ubicación se completa con el objeto de ubicación más reciente incluso antes de iniciar los servicios de ubicación.
Entonces, tengo entendido que si su aplicación termina (y supongo que si no llama a stopMonitoringSignificantLocationChanges desde applicationWillTerminate ), se despertará con un parámetro UIApplicationLaunchOptionsLocationKey a la aplicación: didFinishLaunchingWithOptions . En ese momento, crea su CLLocationManager , llama a startMonitoringSignificantLocationChanges y realiza el procesamiento de la ubicación en segundo plano durante un tiempo limitado . Así que estoy bien con esta parte.
El párrafo anterior solo habla de lo que sucede cuando se termina la aplicación, no sugiere qué hacer cuando se suspende la aplicación. La documentación de didFinishLaunchingWithOptions dice:
La aplicación rastrea las actualizaciones de ubicación en segundo plano, se eliminó y ahora se ha relanzado. En este caso, el diccionario contiene una clave que indica que la aplicación se reinició debido a un nuevo evento de ubicación.
Sugerir que solo recibirá esta llamada cuando se inicie su aplicación (debido a un cambio de ubicación) después de que haya sido cancelado.
Sin embargo, el párrafo sobre el Servicio de cambio significativo en la Guía de programación de reconocimiento de ubicación tiene lo siguiente que decir:
Si deja este servicio en ejecución y su aplicación se suspende o finaliza posteriormente, el servicio activa automáticamente su aplicación cuando llegan nuevos datos de ubicación. Al despertar, su aplicación se coloca en segundo plano y se le da un poco de tiempo para procesar los datos de ubicación. Debido a que su aplicación está en segundo plano, debe realizar un trabajo mínimo y evitar cualquier tarea (como consultar la red) que pueda evitar que regrese antes de que expire el tiempo asignado. Si no es así, su solicitud puede ser cancelada.
Esto sugiere que se le ha despertado con datos de ubicación si su aplicación ha sido suspendida, pero no menciona cómo se le ha despertado:
- ¿El UIApplicationDelegate recibe una devolución de llamada que me dice que estoy reanudando desde un estado suspendido a un estado de fondo?
- ¿El administrador de ubicación (que se secó por congelación cuando se suspendió la aplicación) comienza a recibir devoluciones de llamada de locationManager: didUpdateToLocation: fromLocation ?
- ¿Solo necesito implementar código en mi mensaje didUpdateToLocation que verifica el estado de la aplicación y realiza un procesamiento mínimo si está en modo de fondo?
En el proceso de redacción de esto, creo que acabo de responder mi propia pregunta, pero sería genial que alguien más conocedor confirmara mi comprensión de esto.
fuente
didExitRegion
devolución de llamada, pero no pude hacerlostartLocationUpdates
desde allí, ya que no fue a través del lanzamiento de la aplicación ...Mi comprensión es la siguiente (estoy en el proceso de escribir una aplicación que se base en esta API, pero no he completado este componente lo suficiente como para comenzar a probar):
A pesar de haber sido eliminado en segundo plano, el sistema operativo reiniciará su aplicación. Si el sistema operativo simplemente inicia su aplicación para variar, recibirá una llamada a la aplicación didFinishLaunchingWithOptions :
le ayudará a determinar si ha regresado de un cambio de ubicación en segundo plano.
Independientemente de cómo sucedió, cuando se reinicia su aplicación (a menos que todavía se esté ejecutando en segundo plano como resultado de una tarea en segundo plano y dicha tarea haya comenzado a monitorear los cambios), debe decirle explícitamente que inicieMonitoringSignificantLocationChanges nuevamente porque la devolución de llamada es no más tiempo adjunto después de "secado por congelación". Y sí, solo necesita implementar código en didUpdateToLocation una vez que haya vuelto a adjuntar un controlador de ubicación de algún tipo una vez que regrese del estado suspendido.Esto es lo que estoy haciendo con el desarrollo de mi código en este momento. Como mencioné antes, no estoy listo para probar esto en un dispositivo, por lo que no puedo decir si he interpretado todo correctamente, por lo que los comentaristas, no duden en corregirme (aunque he hecho una lectura sustancial sobre el tema).
Ah, y si por un golpe de mala suerte lanzas una aplicación que hace lo que yo quiero que haga la mía, podría llorar :)
¡Buena suerte!
fuente
Si se evoca la aplicación desde el estado suspendido como resultado de un cambio de ubicación, la aplicación se iniciará en segundo plano.
Todos los objetos estarán activos y recibirás una actualización de ubicación en el delegado existente.
fuente