【问题标题】:Stopping CoreLocation background updates停止 CoreLocation 后台更新
【发布时间】:2011-10-05 01:56:57
【问题描述】:

我的应用注册了后台位置更新(不是重大变化。我需要比公里更多的粒度)

那部分工作正常。我只想在应用程序在后台运行 60 分钟后停止更新。我现在的做法是在我的 CLLocationManager 委托中调用 stopUpdatingLocation

但是,我不确定这是否真的会阻止我的应用接收后台位置更新,或者它是否会,但会忽略它们。理想情况下,我不希望我的应用对电池消耗负责,除非用户活动后的一小段时间。

Apple 的文档往往让我在这个问题上绕圈子。当我认为“在后台执行代码”即将泄露答案时,它会将我引导至“位置感知编程指南”。就在那个人即将具体说明这个问题时,它让我回到“在后台执行代码”。 :)

【问题讨论】:

  • 注意:我对重大更改位置更新不感兴趣。我在城市和郊区对此进行了广泛的测试,即使在行驶 3 公里后,我有时也会得到 0 更新。我想要高质量的位置数据,但在应用程序使用期间的有限时间段内最多可达一小时后。我只想确认stopUpdatingLocation 是否真的会停止 GPS / wifi 无线电三角测量 / 三边测量。谢谢! :)

标签: iphone objective-c cocoa-touch core-location cllocationmanager


【解决方案1】:

我不确定您的应用是否完全对此进行了控制,但stopUpdatingLocation 的文档确实说明了以下内容...

在没有客户端需要位置数据时,禁用事件传递使接收器可以选择禁用适当的硬件(从而节省电力)

这表明如果您的应用程序是唯一请求后台位置数据的应用程序,并且您请求它停止 GPS 接收器将禁用适当的硬件以节省电力,我认为这是您正在寻找的。

我可以建议您在 Settings -> Developer 中启用 Power logging,然后将您的应用程序运行一个小时左右,直到您认为 GPS禁用,再运行一个小时,然后在 Instruments 中比较电源使用情况。这应该可以为您提供更清晰的画面。

【讨论】:

  • 感谢您的指点。我会试一试。确定我的应用程序是否运行良好需要一段时间,但值得花时间投资。我只是希望 Apple 文档中有一个关于如此重要​​的事情的明确答案。他们确实试图让人们进行重大变化(可以理解,电池方面),但是有太多的应用程序想知道距离用户一两个街区发生了什么。
【解决方案2】:

调用stopUpdatingLocation 确实会停止GPS 等等,但如果你将此调用放在CLLocationManager delegatelocationManager:didUpdateToLocation:fromLocation 中,那么它可能永远不会被调用。

请记住,只有在更准确的位置或(根据有效距离过滤器)显着不同的位置可用时,才会执行此方法。如果设备完全不动,并且如果影响精度的环境也没有改变,它可能几个小时都不会被调用(我自己已经验证了几分钟)并且 GPS 也将保持启用这么长时间。

对于仅在前台运行的应用程序,您可以使用 60 分钟的 NSTimer,但对于在后台运行的应用程序,迄今为止我找到的最接近工作解决方案的是预定的 UILocalNotification .但即便如此,用户也需要在应用重新启动并能够关闭 GPS 之前确认警报。

也许beginBackgroundTaskWithExpirationHandler: 是更好解决方案的关键,但我还没有完全弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2017-12-16
    • 2016-05-18
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多