Administrador de location stopMonitoringForRegion no funciona

Una aplicación en la que estoy trabajando actualmente configura la supervisión de la región con la location actual del usuario cuando la aplicación está en segundo plano. Cuando la aplicación vuelve a estar activa, estoy intentando detener la monitorización de la región, pero parece funcionar intermitentemente con la mayoría de las veces, lo que hace que no funcione como se esperaba. Cuando la aplicación está en segundo plano, comienzo a monitorear para la región y funciona bien cuando logging los detalles:

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { DDLogInfo(@"CREATED REGION: %@", region.identifier); } 

Lo que resulta en el siguiente logging:

  • "REGIÓN CREADA: regiónPara: [verdadero lat aquí, verdadero solo aquí] con radio: 100"

Cuando la aplicación se despierta, invoco la siguiente function:

 - (void)stopMonitoringAllRegions { DDLogInfo(@"About to stop monitoring for %d regions", [locationManager monitonetworkingRegions].count); // stop monitoring for any and all current regions for (CLRegion *region in [[locationManager monitonetworkingRegions] allObjects]) { [locationManager stopMonitoringForRegion:region]; } DDLogInfo(@"After stopping, we're currently monitoring for %d regions", [locationManager monitonetworkingRegions].count); } 

Lo que resulta en el siguiente logging aproximadamente el 75% del time:

  • "Acerca de detener el monitoreo para 1 región"
  • "Después de parar, actualmente estamos monitoreando para 1 región"

y con poca frecuencia obtengo lo que parece ser un éxito:

  • "Acerca de detener el monitoreo para 1 región"
  • "Después de parar, actualmente estamos monitoreando para 0 regiones"

Probé un par de cosas sin éxito. Las regiones que estoy creando son CLCircularRegions, que henetworkingan de CLRegion por lo que deberían funcionar independientemente, pero en el bucle forzado he cambiado CLRegion a CLCircularRegion sin efecto. Originalmente estaba usando [locationManager monitonetworkingRegions] por sí mismo, lo que devuelve un NSSet, así que pensé que usar la function allObjects para get la matriz solucionaría el problema, pero no lo ha hecho.

También pensé que podría ser un problema con la mutación de la matriz mientras se enumeraba, pero la única otra publicación que vi en SO decía que lo anterior funcionaba para ellos …

¿Me estoy perdiendo de algo?

Si lee Regiones monitonetworkingRegions , representa todas las regiones supervisadas de todas las instancias CLLocationManager, y probablemente esté controlado por una queue de despacho privado, lo que explicaría los retrasos.

Mi sugerencia sería mantener su propia matriz mutable (o set), usándola para realizar un seguimiento de qué regiones son monitoreadas y cuáles no, y no confiar en el administrador de la location para esa colección.

Ahora que está claro que no puede confiar en cambios inmediatos, diseñaré alnetworkingedor de él en lugar de tratar de encontrar alguna heurística que parezca (hoy) funcionar pero que lo muerda más tarde.