【问题标题】:Requesting iPhone location whilst in background?在后台请求 iPhone 位置?
【发布时间】:2011-04-27 16:41:46
【问题描述】:

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

  • Option_001,蛮力:让 CLLocationManager,startUpdatingLocation 使用 UIBackgroundModes = "location" 一直运行。不推荐,耗电。可应要求提供规律性,精度约。 10-65米。可能只是唯一现实的选择。

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

  • Option_003,混合:我可以在后台使用显着位置变化 (SLC) 作为“显着”移动的指标,然后根据 kCLLocationAccuracyBest 请求 GPS 位置。这会起作用,但 SLC 事件不会以接近 30 秒的间隔到达(尤其是在步行时)。规律性未知,准确度约。 10-50m。

  • Option_004,还有别的吗?任何想法都将不胜感激。


注意: 我以为我有这个工作,因为当您在 iPhone(通过 USB 连接)上按 [LOCK] 时,会调用 applicationWillResignActive 但 NSTimers 不会停止。如果您在 iPhone 未连接的情况下尝试相同的操作(即手机将处于正常使用状态),则 NSTimers 几乎会在调用 applicationWillResignActive 后立即停止。

【问题讨论】:

  • 只是好奇你有什么样的应用程序需要我每 30 秒一次的位置信息?
  • 类似于 Apple 的面包屑示例项目,只是我不想让 CLLocationManager 一直运行,只需每 30 秒左右采样一次(平均步行大约每 50m速度)

标签: iphone objective-c cocoa-touch


【解决方案1】:

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

此外,这将解决您的“非活动”状态问题。只需启用后台定位服务。 Info.plist > 所需的后台模式 > 应用注册位置更新

在后台时,当接收到新位置时,您的应用将进入“后台活动”状态,这将有足够的时间进行 API 调用并推送新位置。

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

注意:此解决方案不适用于 iOS3.x

【讨论】:

  • 嗨,保罗,这确实看起来像我必须要去的方向。我目前的设计是基于启动和停止 CLLocationManager 专门以节省电力为目的的。然而,它看起来更像(如您所建议的)我将不得不让管理器一直运行,并希望在未来的 iOS 版本中具有更多的后台灵活性。非常感谢...
  • 您可以随时停止位置更新。我在我的一个应用程序中使用了这个确切的场景 - 位置管理器在后台运行 1 小时后“停止”。
  • 它会让位置管理器永远在后台获取位置更新,直到应用实例被删除...? @PaulArdeleanu
  • @Kamarshad 是的,但它也会耗尽电池电量。
  • 感谢您的回复,电池耗尽对我来说不是问题@PaulArdeleanu
【解决方案2】:

您可以在 plist 后台活动中添加核心位置。

plist > “必需的后台模式” > “应用注册位置更新”

位置管理器回调

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

将在您的应用程序进入后台时工作。

【讨论】:

  • 它是否可以让位置管理器永远在后台获取位置更新,直到应用实例被删除...? @tamirTLV
【解决方案3】:

有点半答案,但如果我要尝试这个,我会使用 Instruments power profiler + UIBackgroundModes = "location",但将所需的精度设置为 kCLLocationAccuracyHundredMeters(或更低),看看是否给出合理的用电量。

我稍微阅读了 CoreLocation 文档——如果这不起作用,你可能会不走运。

另外,根据您对 SLC 的 500m 精度,您可能已经阅读过这篇文章,但这里对 SLC 的精度进行了很好的分析:http://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 2019-03-07
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2012-08-05
    相关资源
    最近更新 更多