【发布时间】:2016-03-18 21:06:16
【问题描述】:
使用下面的代码,当行驶至少几英里时,行驶距离总是比实际行驶距离低 20-40%。这是在一个大城市旅行,整个旅行都拥有强大的手机和 GPS 信号,所以我知道这不是问题。我使用 Google Maps 和 MapMyHike 验证了实际距离。有任何想法吗? 相关部分代码粘贴如下:
let metersToMiles: Double = 0.000621371
var startLocation: CLLocation!
var lastLocation: CLLocation!
var distanceTraveled: Double = 0
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.requestAlwaysAuthorization() // Location permission for background
self.locationManager.requestWhenInUseAuthorization() // Location permission for foreground
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.activityType = CLActivityType.Fitness
locationManager.pausesLocationUpdatesAutomatically = false
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if startLocation == nil {
print("startLocation is null")
startLocation = locations.first
} else {
let lastLocation = locations.last
let distance = startLocation.distanceFromLocation(lastLocation!)
startLocation = lastLocation
distanceTraveled += distance
}
updateDistanceTraveledText()
}
func updateDistanceTraveledText() {
let distanceTraveledString = "\(String(format:"%.1f", distanceTraveled * metersToMiles))"
distanceTraveledText.text = distanceTraveledString
}
我还尝试了所有类型的 desiredAccuracy,例如 kCLLocationAccuracyBest 和 kCLLocationAccuracyNearestTenMeters 等,根本没有设置 activityType,也将其设置为 AutomotiveNavigation/Fitness 均无济于事。
【问题讨论】:
-
如果您有
always权限,则不需要whenInUse权限。locationsindidUpdateLocations是一个数组;您可能会在此方法中获得多个位置更新。你应该迭代这个数组并添加任何中间距离