应用程序处于后台时,iOS 4使用GPS定期更新位置

时间:2010-12-27 21:01:31

标签: iphone ios multitasking

是否可以让手机每隔30分钟启动一次GPS,并在应用处于后台状态时获取用户的位置?

重要的位置变更服务对我的需求来说有点过于简单。

我试图在任何时候跟踪手机而不会过多地耗尽电池寿命。任何建议都非常欢迎!

3 个答案:

答案 0 :(得分:3)

我知道这是“迟到的”,但据我所知,这仍然是一个问题(总是在寻找解决方案 - 如果有最近的更改请发布)...

不幸的是,这里的回复涵盖了大多数基地,但我的经验可能会有所帮助。使用VOIP标志允许你的应用程序间隔唤醒并进行一些处理(如GPS)很有效,但Apple审查不会允许它,除非你实际上使用VOIP。我们在AppStore中有一个应用程序来完成这个技巧。它工作得很漂亮 - 非常低的电池消耗,完美的GPS跟踪。经过几次更新后,一些smartass评论员(现在可能是自动检查)认出了标志,但我们并没有真正使用voip并拒绝了应用程序。自从我们刚刚开始进行背景GPS跟踪时 - 在电池寿命降至90分钟且GPS持续燃烧时没有多少选择。

与此相关的另一个评论是为什么定时GPS集合在后台没有在调试器中运行时死亡 - 它因为活动线程停止或到期而死亡(如果你已经花了一些时间来完成某些任务),并且有无法基于内部计时器恢复任何后台活动。某种类型的定期通知可能会起作用(我将尝试这种方法)或最坏情况下定期推送通知......但它可能没有足够的时间来获取和报告准确的GPS位置,因此您只需一次再次处于让GPS运行的位置。我们的应用程序具有“强制背景GPS”模式,仅在设备插入时才使用,因此没有电池耗尽,但这是我们迄今为止所发现的最佳效果。

绝对最糟糕的情况(几乎忘记了这一点)是重大变化的选择,但是这已被证明是不准确的并且相距很远(是的,几英里是重要的但是对于真实有什么好处)跟踪)。

定期唤醒方法效果很好,到目前为止(为了节省电池)最符合用户的利益,我惊讶于苹果不允许它为此目的。支持基于位置的应用程序的主要监督。

答案 1 :(得分:1)

Apple只为您提供两种选择,恰好是两个极端:

  1. 使用GPS多任务处理(因为它一直处于打开状态,因此会延长电池寿命)。
  2. 当用户点击Okay时,使用本地通知或推送通知每30分钟(或任何时间间隔)定时打开应用。

答案 2 :(得分:1)

我有一个非常相似的要求:我的应用程序应该定期拍摄高度准确的位置快照(通常是1分钟),即使设备正在睡眠或应用程序在后台,它也必须这样做。 / p>

为了在前台完成此任务,我实现了一个系统,该系统打开位置服务,等待所需精度的位置,然后关闭服务直到计时器触发。这个过程重复并且似乎按预期工作:在收到准确的位置读数之前,返回六个不准确的位置读数(在几秒钟的时间内)。

测试表明这种方法在设备休眠时会起作用,这让我感到惊讶!所以现在我们只需要担心应用程序何时落后。

以下是我在后台使用此功能将其扩展到数据收集的机制:

设置info.plist值以指示应用程序需要更新位置,即使不在前台也是如此。这在Apple SDK文档的“跟踪用户位置”部分中有记录。它保证即使在后台或睡眠状态下也会将位置更新传送到应用程序。

但是,这种方法不允许(开箱即用)定期收集,但是,只要位置服务看到由所需精度值定义的位置变化,就会发送通知。

不幸的是,如果您在应用程序背景后关闭位置服务数据收集,它将不再收到通知(应用程序在后台,请记住吗?)。所以我正在探索在UIApplication上使用setKeepAliveTimeout:handle方法来进行定期检查,有效地替换了我的前台计时器。 [注意 - 要注册KeepAlive处理程序,您还必须设置info.plist以指示应用程序正在执行VOIP]当KeepAlive处理程序被调用时,它会打开处理程序中的位置服务,收集数据,然后关闭位置服务。测试表明,这可以重新启动位置服务通知。但是我看到KeepAlive处理程序只能以10分钟的间隔(600秒)调用,我不确定它是否足够好。

请注意,setKeepAliveTimeout:handle方法适用于VOIP应用程序,显然Apple会仔细检查使用它的应用程序。在我的情况下,这是一个使用无线分发的客户的应用程序,而不是Apple商店,所以这对我来说不是问题。

然而,如果这种方法有效,它似乎可以满足Apple API无法满足的需求:平衡对高精度位置数据的需求,同时仅间隔收集数据以节省电池寿命。 Apple真的应该支持定时收集模型,而不仅仅是基于准确性。啊,好吧!

干杯