使用CoreLocation

时间:2018-11-03 21:13:55

标签: ios swift core-location

我想要的是能够在房屋的车道上走到外面,并在轻按按钮时获取该房屋的地址。

下面的代码可以正常工作,除了有时我在第一次点击按钮时有时得不到正确的地址,我不得不点击几次按钮。

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 :(得分:1)

编辑如何检查

每个CLLocation对象都有一个时间戳属性,将其与now进行比较 (在致电地址解析器之前)

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

首先,在致电地址解析之前,您应按照the doc的建议检查manager.location的时间戳,因为您可能会收到缓存的数据,这些数据并不能真正反映当前位置。

第二,您可能要考虑使用locationManager.requestLocation(),它会报告一个适合您desiredAccuracy的位置,并会自动停止。

最后,您始终可以先检查位置对象,以查看是否有足够的精度,然后再发送给地址解析。