停止返回缓存的 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:啥错误会停止位置更新

iPhone - CLLocationManager 在尝试获取当前位置时停止更新

Xcode 6 为啥 CLLocationManager 没有返回纬度和经度