0

基于另一个 SO question,我实现了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];
            }
        }
    }
}

这段代码一切都有意义,除了我似乎无法让它正常工作。当我单步执行代码时,我发现

  • 位置年龄小于5岁,不错
  • 位置水平精度小于 0,这很好
  • bestEffors 水平精度与位置水平精度相同,所以它永远不会进入那个条件
  • 即使这样做了,它也永远不会调用该stopTrackingLocation方法,因为位置水平精度永远不会 < 0(第二个 if 语句)但是,我的位置管理器所需的精度是 -2(最适合导航),因此它实际上永远不会离开此方法。

我做错了什么,或者我应该如何改变它才能正常工作?

4

1 回答 1

0

问题是您试图获得一个水平精度低于您期望精度的位置。

if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {

但是,常数kCLLoationAccuracyBestForNavigationkCLLocationAccuracyBest不是实数值,它们分别是 -2 和 -1。

问题是您真正需要什么准确度来实现您的目的?这是您应该检查的值。出于测试目的,使用 100 米。这意味着您可能有一个使用 GPS 的位置,而不仅仅是 WiFi 或蜂窝网络。

if (location.horizontalAccuracy <= 100) {

iPhone 5 的实际水平精度永远不会低于 5 米。它可以是 10 或 20 或 50,具体取决于可见卫星的数量及其几何形状。如果系统根本无法修复,它也可以是 -1。这就是这条线的目的,忽略那些无效的位置:

    if (location.horizontalAccuracy < 0) return;

编辑: 只有在配置CLLocationManager 对象的属性时才应使用
常量kCLLoationAccuracyBestForNavigation和。该设置将核心位置硬件配置为启用 GPS、GLONASS 等,以尝试满足您所需的精度(它不保证会满足)。kCLLocationAccuracyBestdesiredAccuracydesiredAccuracy

desiredAccuracy不是您应该在委托方法中使用的值,它仅用于配置 CLLocationManager

于 2013-07-16T04:40:09.293 回答