iOS:从后台(信标)开始监控时,GPS 位置更新仅工作 10 秒

Posted

技术标签:

【中文标题】iOS:从后台(信标)开始监控时,GPS 位置更新仅工作 10 秒【英文标题】:iOS: GPS location updates only work for 10 seconds when starting monitoring from background (beacon) 【发布时间】:2015-07-16 17:26:57 【问题描述】:

我们正在尝试创建一个应用程序,当手机存在信标/iBeacon 时,该应用程序会记录旅程的 GPS 日志。例如,如果您将信标放在汽车中,那么您的所有汽车行程都会被自动记录。

但是,我们立即遇到了问题。如果我们在前台使用应用程序记录旅程,一切正常。但是,如果我们从 DidRangeBeacons() 回调开始记录旅程,我们似乎只获得了 10 秒的数据,然后应用程序被暂停。我们已将所需的属性放在 Info.plist 文件中:

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

此外,该应用程序已正确注册以允许在后台运行时进行位置监控(并在必要时调用 locMgr.RequestAlwaysAuthorization()),并且在 ios 的位置隐私屏幕上一切正常。

似乎有什么东西阻止了操作系统识别应用程序有权在后台跟踪位置。或者我们可能通过直接从 DidRangeBeacons() 回调中调用 CLLocationManager.StartUpdatingLocation() 以错误的方式启动位置监控。

我们可以做些什么来绕过我们似乎达到的 10 秒限制?

我们在这种情况下使用 Xamarin,但我确信如果我们在 Objective C 中我们会遇到同样的问题,因为我怀疑这是滥用 API 的设计问题,因此任何帮助或代码示例来自任何一个平台都会有用。

【问题讨论】:

【参考方案1】:

为确保应用继续接收位置更新,您应该启动background task。这将确保您的应用不会被暂停。通常后台任务允许执行 3 分钟,但如果您在 plist 中指定位置后台权限(您已这样做),您将有无限时间。如果需要为另一个前台应用程序释放内存,该应用程序仍有可能被操作系统终止。但是,您也可以monitor for significant location change。这将大约每 500m-1km 触发一次(随着蜂窝塔和周围可用 wifi 网络的变化),如果应用程序被终止(作为信标监控服务),它实际上会重新启动应用程序。这有意义吗?

【讨论】:

【参考方案2】:

仅仅因为设置了UIBackgroundModeslocation,并不意味着iOS 对后台运行的应用没有任何限制。阅读Using Location Services in the Background了解详情。

Beacon 区域进入事件通常将您的后台测距(和其他后台操作)限制为 10 秒。您可以通过here. 描述的技术将这 10 秒延长到 180 秒,使用后台模式,您应该可以无限延长。

【讨论】:

好的,那么在信标测距事件期间,启动一个新的后台线程来记录GPS位置应该足够了吗? 是的,但您不一定能够让该后台线程永远运行。我知道你可以坚持 180 秒。 但是你如何让它无限期地继续下去呢?应用商店中有数百个应用可以无限时间记录步行/跑步/骑行。 我已经修改了我的答案。正如@goldmine 在他的回答中指出的那样,位置背景模式应该允许您无限期地延长我在博客文章中提到的 180 秒。

以上是关于iOS:从后台(信标)开始监控时,GPS 位置更新仅工作 10 秒的主要内容,如果未能解决你的问题,请参考以下文章

iOS 后台模式下的 GPS 监控

iOS 在后台监控/测距信标会消耗大量电池

应用在后台时启动 CLLocationManager 位置更新

在后台模式下接收 gps 位置更新 ??iOS 8

iOS 上的后台信标测距

iOS 延长信标监控的后台时间