CLLocationManager 在后台停止

Posted

技术标签:

【中文标题】CLLocationManager 在后台停止【英文标题】:CLLocationManager stops in background 【发布时间】:2013-03-29 03:46:30 【问题描述】:

我有一个应用程序,它使用CLLocationManager 来跟踪用户的路线,沿着所走的路径绘制点。应用程序使用必需的后台模式在后台运行 > 应用程序注册位置更新。

据我了解,后台发生的任何事情都需要从 locationManager:didUpdateToLocation:fromLocation 调用,因为这是每次位置更新都会调用的方法。

我遇到的问题是,有时这会停止调用。当用户的位置在大约 15 分钟左右的时间内没有太大变化时,似乎会发生这种情况。据我所知,对locationManager:didUpdateToLocation:fromLocation 的呼叫只是停止,大概是为了节省电池。不幸的是,当您重新开始移动时,它不会再次恢复。

我认为无法覆盖此行为,因此我想使用通知中心通知用户该应用不再记录路线。问题是,应用程序如何知道发生了这种情况?如果未调用 locationManager:didUpdateToLocation:fromLocation,我将无法触发通知。如果正在调用它,则不应触发通知。

【问题讨论】:

我有这个确切的问题。当用户在 15 分钟内没有移动,并且在将应用程序保持在后台时再次开始移动时,不会调用 locationManager:didUpdateLocations。如果用户将应用放回前台,则调用 locationManager:didUpdateLocations,但它不包含用户开始移动到他将应用放回前台之间的所有先前位置。 【参考方案1】:

我认为没有任何方法可以通知位置管理员已停止向您发送事件,但有一种方法可以防止它发生。在 ios 6 中,添加了一项新功能,允许位置管理器在认为服务未被使用时关闭服务。如果您执行以下操作,位置管理器将继续在后台向您发送事件,直到您的电池电量耗尽:

if ([self.locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) self.locationManager.pausesLocationUpdatesAutomatically = 否;

另外,在 iOS6 中,您应该使用 locationManager:didUpdateLocations:,因为 locationManager:didUpdateToLocation:fromLocation: 已弃用。

【讨论】:

所以位置管理器在检测到用户没有移动时会暂停位置更新。当用户再次移动时,位置管理器会恢复检测吗?但这仅适用于应用程序处于前台时。当应用程序在后台时怎么办?根据我的经验,当位置管理器暂停时,它不会在用户再次开始移动时恢复。【参考方案2】:

两种委托方法:

-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager

-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager

告诉您位置更新何时因暂停而停止和开始。

【讨论】:

以上是关于CLLocationManager 在后台停止的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让 CLLocationManager 进入“空闲”而不是“停止”?

在后台写入日志文件

位置更新在后台停止 - iOS

停止返回缓存的 CLLocationManager 位置

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

CL位置高程精度