when usage tutorial startupdatinglocation manager example description current cllocationmanagerdelegate ios location cllocationmanager geofencing

ios - usage - startupdatinglocation swift



Seguimiento de múltiples(más de 20) ubicaciones con geofencing de iOS (5)

Una aplicación de iOS usa el geofencing para notificar al usuario sobre ubicaciones cercanas predefinidas. Se permite que la aplicación pierda alguna ubicación (el usuario no recibe una notificación sobre una ubicación cercana), pero es conveniente mantener baja la tasa faltante.

Una forma de implementar esto sería comenzar a monitorear ubicaciones de cambios significativos con startMonitoringSignificantLocationChanges y cada vez que se startMonitoringSignificantLocationChanges el evento de "cambio de ubicación", busque ubicaciones dentro del radio de 500 m de la ubicación informada.

Lo que me preocupa es el requisito de realizar la consulta para las regiones cercanas cada vez que se produce un cambio de ubicación significativo y afecta a la batería.

La otra forma de hacerlo sería registrar las ubicaciones con startMonitoringForRegion pero Apple ha puesto un límite (razonable) en el número de regiones de seguimiento simultáneo, que es 20 y tenemos significativamente más de 20 ubicaciones. Por lo tanto, se requiere algún tipo de actualización dinámica de las regiones rastreadas, pero todavía no estoy seguro de cuál es la mejor manera de hacerlo.

¿Alguna idea sobre cómo se puede hacer para mantener bajo el consumo de batería pero también tiene la baja tasa de falta de ubicaciones?


Como no había mucha actividad en la pregunta, describiré cómo estamos actualmente resolviendo este problema.

Vinculamos la recarga de las nuevas regiones a eventos significativos de cambio de ubicación (SLC). Cuando se lleva a cabo un SLC, verificamos las 20 regiones vecinas que deben ser "geofenced". Para encontrar las 20 regiones más cercanas, simplemente estamos aproximando 1 '''' de latitud y longitud de acuerdo con las siguientes fórmulas:

Latitud: 1 deg = 110.54 km

Longitud: 1 grado = 111.320 * cos (latitud) km

y simplemente verifique el cuadrado delimitador de la posición actual del dispositivo para los centros de las regiones monitoreadas (consulte: ¿ Cálculos simples para trabajar con lat / lon + km de distancia? )

Entonces, por ejemplo, si (10N, 10E) es la ubicación actual del dispositivo, comenzamos con el cuadrado delimitador con vértices en (10-1 '', 10-1''), (X-10 '', 10 + 1'') , (10 + 1 '', 10 + 1''), (10 + 1 '', 10-1'') (en latitud (10N, 10E) un minuto de latitud / longitud aproximada de 1,85 km).

Si hay 20 (o casi 20), los registramos para el geofencing y esperamos el próximo SCL. Si es menor / más, simplemente aumente / disminuya el tamaño del rectángulo delimitador y repita la búsqueda.

Puede ajustar este algoritmo de búsqueda para un mejor rendimiento, pero el descrito aquí ya hará el trabajo.


Pensé que agregaría otra opción para usar más de 20 Geofences en su aplicación. Esta forma ha estado funcionando bien en nuestra aplicación durante mucho tiempo y utiliza los métodos de CLLocation integrados.

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { if (locations.count > 0) { CLLocation *location = locations[0]; NSMutableArray *sortedFences = [[NSMutableArray alloc] init]; // add distance to each fence to be sorted for (GeofenceObject *geofence in enabledFences) { // create a CLLocation object from my custom object CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(geofence.latitude, geofence.longitude); CLLocation *fenceLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude]; // calculate distance from current location CLLocationDistance distance = [location distanceFromLocation:fenceLocation]; // save distance so we can filter array later geofence.distance = distance; [sortedFences addObject:geofence]; } // sort our array of geofences by distance and add we can add the first 20 NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName]; NSArray *sortedArray = [sortedFences sortedArrayUsingDescriptors:sortDescriptors]; // should only use array of 20, but I was using hardcoded count to exit for (GeofenceObject *geofence in sortedArray) { CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(geofence.latitude, geofence.longitude); CLLocationDistance radius = geofence.radius; NSString *ident = geofence.geofenceId; CLCircularRegion *fenceRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:ident]; fenceRegion.notifyOnEntry = geofence.entry; fenceRegion.notifyOnExit = geofence.exit; [locationController.locationManager startMonitoringForRegion:fenceRegion]; } } }

Con suerte, esto ayudará a alguien o lo guiará por el camino correcto.


Puede reservar una ubicación para un "meta-geofence" que abarque todas las ubicaciones actualmente monitoreadas. Cuando el usuario abandona esta geocerca, se notificará a la aplicación. Luego, la aplicación puede actualizarse automáticamente y dejar de rastrear las áreas más alejadas y comenzar a rastrear nuevas áreas en la vecindad.


Sé que esta publicación es antigua, pero para aquellos que buscan hacer algo similar, Skyhook ofrece la capacidad de geofence un número infinito de lugares.

Desde su mercadotecnia: el acelerador de contexto de Skyhook permite a los desarrolladores y anunciantes de aplicaciones implementar instantáneamente Geofences Infinite en cualquier cadena de marca (como CVS) o categoría de local (como tiendas de conveniencia) a través de una interfaz web simple. Usando la misma tecnología patentada de la red de ubicación de primera persona de Skyhook, el Context Accelerator SDK administra esas geofences activas en el dispositivo, independientemente de las limitaciones del sistema operativo que permiten infinitas geofencing.


Si le preocupa realizar la verificación de proximidad en cada cambio de ubicación significativo, puede usar un método de búsqueda / indexación espacial como R-trees o R * -tree para reducir el número de comparaciones necesarias para cada cambio de ubicación, ya que esos algoritmos de búsqueda filtra regiones (posiblemente grandes) espacialmente irrelevantes. Eso debería reducir la energía de tiempo / batería necesaria para realizar las comprobaciones de proximidad.