Фильтр расстояний не работает должным образом в стандартных службах определения местоположения - PullRequest
0 голосов
/ 02 июля 2018

Я использую стандартные службы определения местоположения для отслеживания местоположения.

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? Можно ли правильно обрабатывать такие условия?

...