【问题标题】:Current Location Bug in Xcode 4.5Xcode 4.5 中的当前位置错误
【发布时间】:2012-11-13 13:07:34
【问题描述】:

在 Xcode 4.5 苹果引入了苹果新的地图。我的应用程序需要地图服务。而且我注意到在我的应用程序中它会显示错误的当前位置,直到您删除应用程序并重新打开它才会显示正确的当前位置(有时不会)。顺便提一下,当它显示错误的当前位置时,我已连接到 4G。有没有办法修复这个错误,因为我的应用程序非常需要正确的位置。提前致谢。如果您可以提供代码,那将有很大帮助...编辑: Apple Map App 中的相同问题

我的代码:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    {

    }

    if (!oldLocation)
        totalDistance = 0.0;
    else
        totalDistance += [newLocation distanceFromLocation:oldLocation];

}

【问题讨论】:

  • 我在我正在开发的一个需要地理围栏的应用程序上注意到了这个问题。它显示了它之前锁定的位置,即使我已经移动了超过几英里(当应用程序在后台时)。
  • 您是如何获得位置的? CoreLocation 实际上缓存了最后一个已知位置,并在您再次启动应用程序时将缓存的位置提供给您。如果您使用的是委托方法,那么您应该检查时间戳,如果它太旧则将其丢弃。
  • 我正在使用corelocation,我们如何删除缓存的位置:)
  • 我想提一下,如果应用程序在后台,然后打开它会显示一些我们没有去的疯狂位置,然后在 5 秒后它显示正确的位置,我们如何解决这个问题。 ..
  • 你不会删除缓存的位置,你只是忽略它,直到出现一个有效的位置。你就像我说的那样做 - 检查时间戳。如果它是旧时间戳,则忽略它,直到出现最近的时间戳。

标签: ios xcode ipad map


【解决方案1】:

Apple 文档中的旧方法在 iOS6 中似乎仍然有效(在我的活动应用中没有注意到这一点(它通过 gps 跟踪用户的路线))

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) return;
    if (newLocation.horizontalAccuracy < 0) return; 

    // proceed with coords here
}

更新来自讨论: 可以像这样计算总距离和当前距离(不包括一些小东西):

// somewhere at the top
CLLocation* lastUsedLocation = nil; // last location used in calculation
CLLocation* pointA = nil;  // start of the track
double totalDistance = 0;  // total distance of track
double currentDistance = 0; // distance between startTrack point and current location
...

// when you start updating location:
- (void) startTracking {
    lastUsedLocation = nil;
    pointA = nil;
    totalDistance = 0;
    currentDistance = 0;
    [locationManager startUpdatingLocation];
}
...


// location update callback
 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return;  // filter cached
    if (newLocation.horizontalAccuracy < 0) return; // filter invalid

    if(!pointA) pointA = [newLocation retain]; 

    if(lastUsedLocation) 
    { 
        totalDistance += [newLocation distanceFromLocation:lastUsedLocation]; 
    } 
    currentDistance = [pointA distanceFromLocation:newLocation]; 
    [lastUsedLocation release]; 
    lastUsedLocation = [newLocation retain]; 
}

如果您需要关闭后台位置的选项,您可以手动禁用它,例如:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    if(backgroundLocationDisabled)
    {
        [locationManager stopUpdatingLocation];
        // additional stuff
    }
}

【讨论】:

  • 这也是你在应用商店中的活跃应用,因为@Scott 告诉我应用商店中的应用没有这个错误......
  • 这取决于目前的环境条件,但是这个小过滤器做得很好。我的应用仍在开发中,我每天都使用 Xcode 4.5 开发它。
  • 您的代码很棒 :) 但我注意到当应用程序进入后台时,当您再次打开它时,它会显示错误的当前位置……
  • 我的应用支持后台定位,即即使在后台也能进行跟踪。这个过滤缓存的帧(locationAge 的东西)和无效的帧(horisontalAccurace),其他的则进一步使用。我没有添加其他微不足道的过滤器(最小准确度和其他),因为它取决于很多,有些用户甚至可能无法获得任何数据。除了我跳过前 3 帧以在轨道开始时平滑“精度增强”阶段。如果我的客户需要,我稍后会添加一些高级过滤。但如果 GPS 覆盖良好,即帧具有良好的恒定精度,则此方法效果很好。良好的复杂性/优势。
  • 您只需在项目的“信息”选项卡中将“用于位置更新的应用程序注册”添加到“所需的后台模式”。仅此而已,即使在后台也会调用这些位置更新例程。请注意,您必须在您的应用描述中添加一条注释,例如“应用因背景位置而消耗电池电量”,否则将无法通过审核。为了节省电量并避免这种情况,您可以使用重要的位置更新,但它不适合准确的位置跟踪。
【解决方案2】:

我注意到 Xcode 4.4+ 存在同样的问题。该问题仅在 Xcode 中发生(随机发生,或者看起来如此):如果您将应用程序上传到 App Store,这不再是问题。同时,请提交一个错误。

【讨论】:

  • 但是你不是从 App Store 下载这个应用的,是吗?
  • 没错。如果你从 App Store 下载它,它就可以正常工作。
  • 是的,你可以。但是,如果您需要测试要求您的应用显示正确位置的功能,您可能会遇到问题。
  • 你在 App Store 中有没有没有这个 bug 的应用程序(我只是想确保代码没有问题)......
【解决方案3】:

您应该检查时间戳.. 如果我正确理解您的应用程序逻辑,您可以执行类似的操作 -

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {

NSDate* time = newLocation.timestamp;
    NSTimeInterval timePeriod = [time timeIntervalSinceNow];
    if(timePeriod < SOME_MINIMUM_TIME_PERIOD ) { //for eg: timePeriod < 1.0
               totalDistance += [newLocation distanceFromLocation:oldLocation];
    } else {
        // skip.. or do what you do on a 'location-not-updated' event
    }
}

【讨论】:

  • 在 //skip.. 中只有一个问题。或者在“位置未更新”事件中执行您所做的操作,我应该在其中放置什么……。
  • 我有一个快速的问题,当没有当前位置时,我可以显示警报....
  • 位置 0.0,0.0 在无法确定位置时返回(因为 gps 已关闭或其他原因).. 您可以将其作为检查并显示警报..
  • if(timePeriod
  • 这行代码呢?你是在问这段代码是做什么的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多