基于另一个SO问题,我已经实现了didUpdateLocations:
方法如下:
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// Get the latest location found
CLLocation *location = [locations lastObject];
NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) return;
if (location.horizontalAccuracy < 0) return;
if (_bestEffort == nil || _bestEffort.horizontalAccuracy >= location.horizontalAccuracy) {
_bestEffort = location;
// Let the delegate know
if (self.delegate && [self.delegate respondsToSelector:@selector(location:didUpdateLocationTo:)]) {
[self.delegate location:self didUpdateLocationTo:location];
}
if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {
// Great, we've found our final location so stop searching!
[self stopTrackingLocation];
// Let our delegate know we've finished our work
if (self.delegate && [self.delegate respondsToSelector:@selector(location:didFinishTrackingLocationWithFinalLocation:)]) {
[self.delegate location:self didFinishTrackingLocationWithFinalLocation:location];
}
}
}
}
使用此代码一切都有意义,除了我似乎无法使其正常工作。当我单步执行代码时,我发现
stopTrackingLocation
方法,因为horizontalAccuracy的位置永远不会是&lt; 0(第二个if语句)然而,我的位置管理员所需的准确度是-2(最适合导航),因此它实际上从未离开过此方法。我做错了什么,或者我应该如何更改它才能正常工作?
答案 0 :(得分:0)
问题在于您尝试获取的horizontalAccuracy小于您所需的精度的位置。
if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {
但是,常量kCLLoationAccuracyBestForNavigation
和kCLLocationAccuracyBest
不是实数值,它们分别是-2和-1。
问题是你真正需要的准确度是多少?这是你应该检查的价值。出于测试目的,使用100米。这意味着您可能拥有使用GPS的位置,而不仅仅是WiFi或移动电话。
if (location.horizontalAccuracy <= 100) {
iPhone 5的实际水平精度永远不会低于5米。根据可见卫星的数量及其几何形状,它可以是10或20或50。如果系统根本无法获得修复,它也可以是-1。这就是这条线的用途,忽略那些无效的位置:
if (location.horizontalAccuracy < 0) return;
修改
只有在CLLocationManager对象上配置kCLLoationAccuracyBestForNavigation
属性时,才应使用常量kCLLocationAccuracyBest
和desiredAccuracy
。 desiredAccuracy
设置配置核心位置硬件以启用GPS,GLONASS等,以尝试以满足您所需的准确度(它不保证会满足)。
desiredAccuracy
不您应该在委托方法中使用的值,它仅用于配置CLLocationManager。