停止返回缓存的 CLLocationManager 位置
Posted
技术标签:
【中文标题】停止返回缓存的 CLLocationManager 位置【英文标题】:Stop Returning Cached CLLocationManager Location 【发布时间】:2011-01-16 18:11:51 【问题描述】:我想知道是否有某种方法可以使 CLLocationManager 不会自动返回缓存位置。我知道文件说“位置服务尽快返回初始位置,在可用时返回缓存信息”但是这个缓存的位置可能离用户的当前位置非常远,如果可能的话,我希望它更精确。
感谢您的帮助!
【问题讨论】:
【参考方案1】:你无法阻止它缓存,但过滤掉缓存的数据并不难。核心位置包括带有位置的时间戳。将位置的时间戳与您的应用启动时保存的时间戳进行比较,您将能够分辨出哪些位置是旧的(缓存,在您的应用声明之前找到),哪些是新的。扔掉旧的。
位置时间戳是一个 NSDate,因此只需在您的应用启动时获取 [NSDate date]
的值,并在过滤位置时将其用作您的参考点。一旦您开始获取新数据,您甚至可以丢弃参考值,并将零参考日期视为暗示应该信任新位置。
【讨论】:
如果用户更改设备的日期和时间,此解决方案将不起作用。【参考方案2】:-(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation *)oldLocation
if ([newLocation.timestamp timeIntervalSinceNow] > -10.0) // The value is not older than 10 sec.
// do something
【讨论】:
【参考方案3】:您可以使用 CLLocationManager 的这个属性:
@property(readonly, NS_NONATOMIC_IPHONEONLY) CLLocation *location;
如果从未检索到任何位置数据,则此属性的值为 nil
,否则,这是 CoreLocation 缓存其数据的位置。因此,如果您总是想从头开始,只需检查此属性是否为nil
。如果是nil
,那就没问题;否则,您需要停止您的位置管理器并重新启动它:这将强制更新,这将导致缓存值被您刚刚触发的新值覆盖。
【讨论】:
您好,不可原谅:我已将文档解释为该位置缓存在系统级别(但如果这不准确,请告诉我)。这在那种情况下有效吗? 据我所知,您所说的系统级别是位置属性;因此它应该工作。您可以通过在您的应用程序中使用核心位置来检查这一点,以便 location 属性不为零。然后,从设备中删除应用程序,将其关闭再打开,然后再次安装应用程序会导致出现确认面板(允许使用您的位置),并且我已验证在这种情况下 location 属性始终为零。现在,您无需执行所有这些操作,只需删除旧的缓存值,停止您的位置管理器并重新启动它 您还可以在设置中重置位置警告;这也应该在不删除/重新安装您的应用的情况下重置位置属性。以上是关于停止返回缓存的 CLLocationManager 位置的主要内容,如果未能解决你的问题,请参考以下文章
CLLocationManager stopUpdatingLocation 不会停止
有没有办法让 CLLocationManager 进入“空闲”而不是“停止”?
CLLocationManager didRangeBeacons 停止在前台工作
CLLocationManager didFailWithError:啥错误会停止位置更新