我有一个应用程序(iOS 9,Xcode 7.3,Swift),可跟踪用户位置并根据该位置计算距离。该应用程序已在商店已有3个星期了。有大约5000个用户和一个用户(我知道)报告的距离(很多)高于实际距离。
我得出的结论是,很可能是一个问题(硬件可能???)和他的手机。请参阅下文我是如何得出这个(初步)结论以及为什么我坚持使用它直到其他用户开始报告相同的事情 - 这里的某人可以说服我这是我的代码中的问题 <登记/> (请不要告诉我它是一个缓存的坐标,因为那时的时间戳是相同的(不是吗?),我的代码会过滤掉它)
这是代理中的代码:
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
dispatch_async(processLocationUpdateQeue) { [unowned self] in
guard newLocation != nil && newLocation.horizontalAccuracy >= 0 && newLocation.timestamp.isLaterThan(self.previousLocation?.timestamp) && newLocation.timestamp.isLaterThan(self.tripStartTime) else {
return
}
if self.previousLocation != nil {
self.coveredDistanceInMeters = self.coveredDistanceInMeters + Float(newLocation.distanceFromLocation(self.previousLocation!))
}
self.previousLocation = newLocation
// Some other stuff
}
}
这位用户非常友好,可以进行更多测试。还有其他应用程序(由其他开发人员)。我们发现它不仅是我的应用程序,而且每个通过传入坐标跟踪距离的应用程序在他的手机上都有同样的问题。像TomTom和Navigon这样的导航应用程序在他的手机上没有这个问题,但我猜这是因为他们根据计算出的路线而不是传入的坐标来计算行驶距离。
我分析了他的设备上的坐标,发现相同的坐标有时会出现7次(每次都有不同的时间戳)。坐标进入的每个后续时间都是立即跟随正确的坐标。不幸的是我只登录到第二个,所以不确定这是多么接近。以下是详细信息:
在这种情况下,旅行的前6分钟很好。没有奇怪的事情发生。
6分钟后,GPS发送的坐标进入两次,有时甚至超过两次,但时间戳不同。以下是一些屏幕截图:
一个不同的坐标进来,在路上。虽然奇怪的是,在上一次之后并不是立竿见影的。距离还可以。
然后坐标144再次进入(如146),但具有不同的时间戳。所以,它认为你从145移回(并计算它的距离)
另一个坐标进来。超过145.所以,这是一个正确的坐标。但它正在计算146的距离,即之前的坐标。 (事实上146应该被忽略,应该计算145的距离,这是更接近的)