Я использую стандартные службы определения местоположения для отслеживания местоположения.
locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.distanceFilter = DISTANCE_LIMIT //value set to 20
locationManager.allowsBackgroundLocationUpdates = true
locationManager.startUpdatingLocation()
С установленным расстоянием фильтра я предположил, что обновления местоположения будут приниматься только тогда, когда местоположение пользователя изменяется на указанное расстояние. Однако обновления были получены для перемещений, которые были меньше предварительно установленного значения расстояния.
Поэтому я настроил свой метод делегата следующим образом:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard locations.count > 0 else {
return
}
guard let location = locations.last else {
return
}
let previousLocationEncoded = UserDefaults.standard.object(forKey: UserDefaultKey.previousVisitedLocation) as? Data
if previousLocationEncoded == nil {
let encodedLocation = NSKeyedArchiver.archivedData(withRootObject: location)
UserDefaults.standard.set(encodedLocation, forKey: UserDefaultKey.previousVisitedLocation)
// do some task
} else {
let previousLocationDecoded = NSKeyedUnarchiver.unarchiveObject(with: previousLocationEncoded!) as! CLLocation
let distanceBetweenVisits = previousLocationDecoded.distance(from: location)
if distanceBetweenVisits > DISTANCE_LIMIT {
// do some other task
let encodedLocation = NSKeyedArchiver.archivedData(withRootObject: location)
UserDefaults.standard.set(encodedLocation, forKey: UserDefaultKey.previousVisitedLocation)
}
}
}
Цель состоит в том, чтобы вычислить расстояние текущего местоположения от ранее сохраненного местоположения, чтобы определить, изменилось ли местоположение по значению фильтра расстояния.
Однако иногда, даже если я не двигаюсь, условие distanceBetweenVisits> DISTANCE_LIMIT становится истинным. Это что-то зависит от iOS и GPS? Можно ли правильно обрабатывать такие условия?