Obtener una precisión realmente mala de CLLocationManager

Estoy usando CLLocationManager para get la location de los usuarios.

Quiero get una única actualización de location.

Mi problema es que me estoy poniendo muy mal horizontalAccuracy

La location es% @ <+ xx.xxxxxx, + yy.yyyyyyy> +/- 3881.91m

verticalAccuracy: 65.4401861912846, horizontalAccuracy: 3881.90892434957

Código:

 fileprivate lazy var locationManager: CLLocationManager = { let manager = CLLocationManager() manager.desinetworkingAccuracy = kCLLocationAccuracyBest manager.delegate = self manager.requestAlwaysAuthorization() manager.pausesLocationUpdatesAutomatically = false manager.desinetworkingAccuracy = kCLLocationAccuracyBest manager.distanceFilter = kCLDistanceFilterNone return manager }() override init() { super.init() locationManager.startUpdatingLocation() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let mostRecentLocation = locations.last else { return } let verticalAccuracy = mostRecentLocation.verticalAccuracy let horizontalAccuracy = mostRecentLocation.horizontalAccuracy print("location is %@", mostRecentLocation) print("verticalAccuracy: \(verticalAccuracy), horizontalAccuracy:\(horizontalAccuracy)") } 

¿Alguna sugerencia por qué sucede esto? Estoy en una habitación al lado de una window, así que salvo para get una mala precisión, pero no tan mal.

Gracias


Estoy obteniendo resultados ridículos.

Obtuve una precisión horizontal de 15,000 m.

Cuando salgo puertas funciona bien pero en puertas no debería ser tan malo como este.

Usar la triangulación celular y wifi debería dar mejores resultados.


Después de 20 minutos comencé a get buenos resultados de + – 50 m de precisión en las puertas.

Siempre he descubierto que cuando comienzas las actualizaciones de location, las primeras pocas lecturas son bastante pobres, y luego la precisión mejora a medida que el GPS se establece.

Lo que hago es primero verificar si la timestamp en la location tiene más de unos segundos de antigüedad. Si es así, lo descarté. (No estoy seguro si las versiones recientes del sistema operativo todavía envían lecturas GPS "obsoletas", pero el sistema solía proporcionarle una location desde la última vez que se encendió el GPS, algunas veces con varias horas de antigüedad).

Una vez que obtengo las ubicaciones actuales, verifico la precisión y descarté cualquier actualización de la location, cuya lectura de precisión es muy pobre. Solo cuando obtengo una lectura que sea suficiente, la uso (y detengo las actualizaciones de location en tu caso, ya que solo quieres 1 actualización).

Tenga en count que el GPS puede tardar 30 segundos (o más) en asentarse, y en un área con poca señal de GPS, es posible que nunca obtenga una lectura lo suficientemente buena.

Sugiero que agregue una condición para asegurarse de que solo utilizará una location que tenga una mayor precisión. En mi caso utilizo 20 como la precisión horizontal deseada en el ejemplo a continuación.

Ejemplo:

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { locationManager.stopUpdatingLocation() if locations.last!.horizontalAccuracy < 20 { //Only use location that enters here } else { //If the accuracy is not met then start updating location again and if possible increase more the accuracy (use kCLLocationAccuracyBestForNavigation if you really need it). Make sure that you use the desinetworking accuracy and filter properly to avoid draining battery. locationManager.startUpdatingLocation() } }