didUpdateToLocations:永无止境?

时间:2013-07-15 22:27:44

标签: ios6 core-location

基于另一个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];
            }
        }
    }
}

使用此代码一切都有意义,除了我似乎无法使其正常工作。当我单步执行代码时,我发现

  • locationAge小于5,这很好
  • locations horizo​​ntalAccuracy小于0,这是好的
  • bestEfforts水平精度与位置水平精度相同,因此它永远不会进入该条件
  • 即使它确实如此,它也永远不会调用stopTrackingLocation方法,因为horizo​​ntalAccuracy的位置永远不会是&lt; 0(第二个if语句)然而,我的位置管理员所需的准确度是-2(最适合导航),因此它实际上从未离开过此方法。

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

1 个答案:

答案 0 :(得分:0)

问题在于您尝试获取的horizo​​ntalAccuracy小于您所需的精度的位置。

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属性时,才应使用常量kCLLocationAccuracyBestdesiredAccuracydesiredAccuracy设置配置核心位置硬件以启用GPS,GLONASS等,以尝试以满足您所需的准确度(它不保证会满足)。

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