2011-04-27 77 views
13

简单的问题...我有一个应用程序以30秒的时间间隔(使用NSTimer)记录用户位置,它完美地工作,直到应用程序变为“不活动”并且NStimer停止。因此,我正在寻找可以保持我的位置间隔(30秒)的选项,同时仍能够记录相当准确的位置数据(精度在100米以内)。在后台请求iPhone的位置?

  • Option_001,蛮力:让CLLocationManager,startUpdatingLocation使用UIBackgroundModes = “位置” 运行所有的时间。不推荐使用电池。按要求定期,准确性约。 10-65m。可能只是唯一现实的选择。

  • Option_002,SLC:我可以使用显着的位置更改,但位置更新的频率很差(更不用说准确性)。如果应用程序在有限数量的手机塔的农村或荒野地区运行,则尤其如此。规律性未知,准确性约。 500米

  • Option_003,混合型:我可以用在后台为“显著”运动的指标显着位置更改(SLC),然后请求基于kCLLocationAccuracyBest的GPS位置。这可以起作用,但SLC事件不会在接近30秒的时间间隔内到达(特别是在步行时)。规律性未知,准确性约。为10-50m。

  • Option_004,还有其他什么?任何想法将不胜感激。


注:我想我有这个工作,因为当您按下[LOCK]在iPhone(通过USB连接)applicationWillResignActive的调用,但NSTimers不停止。如果您尝试与未连接的iPhone相同(即电话处于正常使用状态),NSTimers会在调用applicationWillResignActive后立即停止。

+0

只是好奇你有什么样的应用程序,你需要我的位置每30秒? – 2011-04-30 20:29:03

+0

像苹果的面包屑示例项目的排序,只是我不想让CLLocationManager始终运行,只需每30秒左右采样一次(即平均步行速度约为每50米) – fuzzygoat 2011-05-02 07:36:38

回答

21

首先,不要使用定时器来更新用户位置。从另一端接近: 检查收到新位置时自上次“录制”以来的时间间隔,并决定是否要录制新位置。

此外,这将解决您的“无效”状态问题。只需启用后台定位服务。 Info.plist>所需的背景模式>位置更新的应用程序寄存器

在后台收到新位置时,您的应用程序将处于“后台激活”状态,以便有足够的时间进行API调用,推新的位置。

一句话,你需要设计这个应用程序以适应新的背景模式。

注意:此方法不适用于iOS3.x

+0

嗨保罗,那某些看起来像我将不得不走的方向。我目前的设计是基于启动和停止CLLocationManager来实现节能目的。然而,看起来更像(如你所建议的),我将不得不让经理一直在运行,并希望在未来的iOS版本中有更多的后台灵活性。非常感谢... – fuzzygoat 2011-05-04 13:34:39

+0

你可以随时停止位置更新。我在我的一个应用程序中使用了这种确切的场景 - 位置管理器在后台运行1小时后“停止”。 – 2011-05-04 23:27:02

+0

它将使位置管理器能够永久获取位于后台的位置更新,直到应用程序实例被删除...? @PaulArdeleanu – Kamarshad 2014-06-09 06:25:24

1

排序的一个半答案,但如果我打算尝试这个,我会使用Instruments power profiler + UIBackgroundModes =“location”,但将期望的准确性设置为kCLLocationAccuracyHundredMeters(或更少)并查看是否这给出了一个合理的用电量。

我通过CoreLocation文档读了一下 - 如果这不起作用,您可能会运气不好。

此外,根据您的500米精度为SLC,你可能已经读过这一点,但有SLC的准确性这里的一个很好的分析:http://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/

2

工作,你可以在后台的plist添加活动的核心位置。

的plist> “所需的背景模式”> “应用程序注册了位置更新”

位置管理回调,而你的应用程序切换到后台

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

会工作。

+0

它将使位置管理器能够永久获得位置更新,直到应用程序实例被删除...? @tamirTLV – Kamarshad 2014-06-09 06:25:07