Повысить уровень точности, чтобы получить ближайший адрес при нажатии кнопки с помощью CoreLocation - PullRequest
0 голосов
/ 04 ноября 2018

Что я хочу, так это иметь возможность выходить на улицу на подъездной дорожке дома и получать адрес этого дома при нажатии кнопки.

Приведенный ниже код работает нормально, за исключением того, что я иногда не получаю правильный адрес при первом нажатии кнопки, мне приходится нажимать кнопку несколько раз.

class ViewController: UIViewController, CLLocationManagerDelegate{

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        locationManager.requestWhenInUseAuthorization()
    }

    @IBAction func myLocation(_ sender: Any) {
        locationManager.startUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)-> Void in
            if error != nil {
                print("Reverse geocoder failed with error: \(error!.localizedDescription)")
                return
            }

            if placemarks!.count > 0 {
                let placemark = placemarks![0]
                self.locationManager.stopUpdatingLocation()

                print("Address: \(placemark.name!) \(placemark.locality!), \(placemark.administrativeArea!) \(placemark.postalCode!)")

            }else{
                print("No placemarks found.")
            }
        })
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Location manager error: \(error.localizedDescription)")
    }   
}

Как вы видите, я прекращаю обновлять местоположение, как только метка найдена, можно ли что-то сделать для повышения точности.

Какова логика для повышения уровня точности, чтобы получить ближайший адрес при нажатии кнопки?

1 Ответ

0 голосов
/ 04 ноября 2018

РЕДАКТИРОВАТЬ, как проверить

Существует атрибут временной метки для каждого объекта CLLocation, сравните его с now (до вызова геокодера)

let howRecent = newLocation.timestamp.timeIntervalSinceNow
guard newLocation.horizontalAccuracy < 20 && abs(howRecent) < 10 else { continue }

Во-первых, перед вызовом геокода вы должны проверить метку времени manager.location, как предложено в документе , потому что вы можете получить кэшированные данные, которые не отражают текущее местоположение.

Во-вторых, вы можете рассмотреть возможность использования locationManager.requestLocation(), он сообщает о местоположении, которое соответствует вашему desiredAccuracy, и останавливается автоматически.

Наконец, вы всегда можете проверить объект местоположения, чтобы убедиться, что у вас достаточно точности перед отправкой в ​​геокод, а если нет, начать заново.

...