when usage tutorial requestwheninuseauthorization manager description corelocation iphone ios core-location cllocationmanager

iphone - tutorial - location when in use usage description



Simulador de XCode/iOS: active el cambio significativo de ubicaciĆ³n manualmente (9)

¿Hay alguna manera de indicarle al dispositivo que envíe una notificación de cambio de ubicación significativa que activará las aplicaciones registradas para esta notificación? Esto es solo para pruebas, y me doy cuenta de que esta llamada API privada sería rechazada al ser enviada a la tienda de aplicaciones.


Bueno, esto no es posible ya que el alcance de la aplicación se limita a su propio espacio y ese tipo de notificación no se puede generar con la lista de API documentadas de Apple. Por supuesto ... si se utiliza alguna API no documentada, la aplicación recibirá el rechazo de Apple debido al uso de API privada / no documentada.


Bueno, he descubierto que puedo hacer esto activando y desactivando el modo Avión y / o WiFi. Tal vez inicie la aplicación con el dispositivo en modo avión, luego cierre la aplicación y apague el modo avión. Eso encenderá el GPS y obligará a enviar una actualización de ubicación.


Dependiendo de su escenario, sugeriría dos soluciones:

  1. Utilice un temporizador o notificación local que periódicamente llama a stopMonitoringSignificantLocationChanges seguido de startMonitoringSignificantLocationChanges que debe activar una nueva ubicación para ser enviada a su código (podría ser la misma ubicación que antes).

  2. Cree su propio simulador de GPS que comience en compilaciones de depuración y que invoque los mismos métodos de delegado que haría CLLocationManager.


En iOS 4, puede registrarse para cambios significativos de ubicación. De los documentos de Apple: con este servicio, las actualizaciones de ubicación se generan solo cuando la ubicación del usuario cambia significativamente; por lo tanto, es ideal para aplicaciones sociales o aplicaciones que proporcionan al usuario información no crítica y relevante para la ubicación. Si la aplicación se suspende cuando ocurre una actualización, el sistema la activa en segundo plano para manejar la actualización. Si la aplicación inicia este servicio y luego se termina, el sistema relanza la aplicación automáticamente cuando una nueva ubicación esté disponible. Este servicio está disponible en iOS 4 y posteriores, solo en dispositivos que contienen una radio celular.

Vea los documentos de Apple aquí y here .

Aquí hay un código de ejemplo para registrarse para actualizaciones de ubicación de significación:

- (void)startSignificantChangeUpdates { // Create the location manager if it doesn''t exist if (nil == locationManager) locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager startMonitoringSignificantLocationChanges];

}

Los documentos dicen: si deja este servicio en ejecución y su aplicación se suspende o cancela posteriormente, el servicio automáticamente activará su aplicación cuando lleguen nuevos datos de ubicación. En el momento del despertar, su aplicación se pone en segundo plano y se le da una pequeña cantidad de tiempo para procesar los datos de ubicación. Debido a que su aplicación está en segundo plano, debe hacer un trabajo mínimo y evitar cualquier tarea (como consultar la red) que pueda evitar que vuelva antes de que expire el tiempo asignado. Si no lo hace, su aplicación puede ser cancelada.


Entonces dos respuestas:

A) Súbete al tren :-)

B) Usa el simulador. En el simulador iOS 5.x, hay un menú de depuración que tiene un submenú de ubicación. Elija la unidad de la autopista. Esto iniciará el simulador en un viaje imaginario por el escénico 280 en el norte de California. Te ofrece todo menos la vista: tu aplicación obtendrá actualizaciones significativas de cambio de ubicación y también se lanzará en segundo plano si se ha suspendido.

Para verificar que realmente se está moviendo, inicie safari en el simulador y vaya a maps.google.com y haga clic en el botón de seguimiento mi ubicación. Deberías moverte.

¡Increíble! ¿Ahora cómo depurar el problema del ciclo de vida de ser lanzado por el sistema? ¡Fácil! Haga que xCode espere a que su aplicación se inicie para iniciar la depuración. En el menú Esquema, elija editar esquema. En el Esquema de ejecución y en la pestaña Información, para la configuración "Iniciar", seleccione: " Esperar a que se inicie My.app ".

Ejecute su aplicación una vez en el simulador, para que comience a monitorear las actualizaciones de ubicación, luego fuerce a salir de modo que se suspenda. Agregue un punto de interrupción en su aplicación si terminó la función de inicio y espere. Tan pronto como su simulador haya ido lo suficientemente lejos, su aplicación se despertará, su punto de interrupción llegará, y usted está en el dinero.

Pero realmente, el viaje en tren es más divertido.


Estaba luchando con el mismo problema, cómo probar ''startMonitoringSignificantLocationChanges'' y comprobar si mi aplicación está recibiendo actualizaciones de ubicación cuando se suspende.

No pude lograr la ejecución en un punto de interrupción, pero logré ver los resultados de mi implementación funcionando enviando los nuevos datos de ubicación al servidor.

Todo el flujo: - Implementado con ''startMonitoringSignificantLocationChanges'' y una llamada API a mi servidor para actualizar la ubicación de latitud y longitud - Establecer la ubicación actualiza la capacidad de modo de fondo a verdadero - Ejecuta la aplicación para que el administrador de ubicación se inicie y la aplicación esté escuchando cambios de ubicación - Forzar cerró la aplicación - Establecer la ubicación de depuración en el simulador para manejar en la autopista - Mapas abiertos para ver si la ubicación está cambiando - Esperado en el servidor para ver actualizaciones de ubicación y obtenía nuevos resultados cada 3 minutos

Sin embargo, todavía no estoy seguro de si esto es lo suficientemente bueno en un dispositivo real.

Estoy trabajando en Xcode Version 6.0.1 (6A317); probado en Simulator iPhone 5s (8.0).


Freeway Drive

// MARK: - MKMapViewDelegate func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { guard let location = userLocation.location else { return } print(location.speed) }


También quería probar el relanzamiento de mi aplicación finalizada, que utiliza una importante supervisión de cambios. Escribí un fragmento de código para que mostrara una notificación local cuando se inicia con una clave de ubicación en el diccionario de opciones de inicio.

Ejecuté mi aplicación en el simulador. Luego lo mató de la barra multitarea. Luego configuré la ubicación del simulador de iOS en una ubicación personalizada. Salí del simulador y lo inicié de nuevo. Mi aplicación recibió la actualización de ubicación significativa y mostró la notificación local.


Una cosa que noté en iOS 7 y Xcode 5.1.1: si esperas que los eventos de SLC activen tu aplicación en modo de fondo, puede que lleguen o no a los puntos de interrupción que establezcas. Para mí, a veces el mensaje NSLog ni siquiera se muestra.

Si ese es su caso, puede ver las salidas de NSLog desde el registro del sistema. Puede abrir el registro del sistema desde el menú de depuración del simulador de iOS.