【问题标题】:What strategy to adopt to monitor the user location in background?采用什么策略在后台监控用户位置?
【发布时间】:2017-07-17 14:33:46
【问题描述】:

我想在后台跟踪用户位置,目的是在他靠近他的一位朋友时向他显示警报。

所以我从CLLocationManager 开始。据我所知,即使用户重新启动 Iphone 或终止应用程序,它们也是让应用程序了解位置更新的唯一一种可靠方法:startMonitoringSignificantLocationChanges。但问题是,即使在一个有很多 wifi 的城市内,startMonitoringSignificantLocationChanges 会在用户移动 1 公里左右时触发 DidUpdateLocations,这对我的需求来说实在是太多了

另一方面,startUpdatingLocation 以良好的间隔触发DidUpdateLocations(甚至太多,因为即使用户不移动它也经常触发DidUpdateLocations)。但是startUpdatingLocation 无法在 iphone 重新启动或应用程序被用户杀死后存活下来。另外我怀疑即使精度为 100m,startUpdatingLocation 也会消耗大量电池。

所以问题是:我可以在我的应用中使用什么策略来有效地跟踪而不会消耗太多电池全时用户位置?我需要大约 100m 的精度,如果可能的话,每条轨道的间隔在 2.5 到 5 分钟之间(我没有找到任何选项来指定在捕捉新位置之前等待的延迟)

其实我想这样做:

  • 2 locationManager、1 GPS 和 1 重大变化
  • 当应用启动时,我使用 significantChangesLocationManagerstartMonitoringSignificantLocationChangesstartMonitoringVisits
  • 我还调用 GPSLocationManager startUpdatingLocation 来检索准确的用户位置。我设置了PausesLocationUpdatesAutomatically(true),以便 GPSLocationManager 迟早会自行停止
  • DidUpdateLocationsGPSLocationManager 提出,我开始使用 significantChangesLocationManager 监控区域进入/退出(获得的纬度/经度周围 100 米半径)

您如何看待这种策略?

【问题讨论】:

  • @GIJOW:这个问题与每 n 分钟一次的后台位置更新不同,例如,它们不是关于电池消耗的词,这是我首先关心的问题。所以请删除重复的链接
  • 这就是为什么“可能重复”而不是“重复”
  • aah 好的,所以我在这里添加完整的注释,以免破坏问题:这个问题与stackoverflow.com/questions/41014848/… 不同,例如,它们不是关于电池消耗的词,这是我首先关心的,也不重启系统。这个问题是关于计时器并将其作为后台任务,我认为这是一个非常糟糕的策略。所以请删除可能的重复链接。 .. 无论如何,现在你知道它甚至不可能是重复的 ;)
  • 在这个中,没有关于应用程序被杀死或系统重启的消息:(

标签: ios core-location cllocationmanager


【解决方案1】:

尽管您会收到比您需要的更多的触发器,正如您已经说过的,您可以使用startMonitoringSignificantLocationChanges。它以非常节能的方式实施。它允许应用程序被终止,并且只有在 iOS 认为设备发生重大移动时才会再次被唤醒。另一个优点是您的应用不需要 location 后台模式,这可能会在应用审核期间提出问题。

startUpdatingLocation 让应用程序不断更新设备的位置,即使您只收到几个 didUpdateLocations: 事件。此外,iOS 在更新期间无法关闭应用程序,因此会消耗大量电池。

您也可以考虑使用地理围栏,在当前位置周围设置出口地理围栏。但是,重要的位置更新将更加可靠。一旦您已经离开地理围栏,退出地理围栏将不再触发,当手机在地理围栏内关闭并在外面重新打开时,可能会发生这种情况。此解决方案具有不需要后台模式的相同优点。

据我了解您的用例,startMonitoringSignificantLocationChanges 听起来是最佳选择。您无法控制它触发的确切时间间隔和距离,但它非常节能且易于使用。

【讨论】:

  • 谢谢马克!但无论如何 startMonitoringSignificantLocationChanges 会给我一个 500 - 1km 的精度太低:( 所以它只会在用户移动 1km 时触发事件,我想要大约 100 - 200m 的东西。我现在正在寻找地理围栏但无法理解为什么使用地理围栏我可以有 100m 的精度,但不能使用 startMonitoringSignificantLocationChanges 来获得相同的电池消耗:(
【解决方案2】:

正如 cmets 中所述,为了在我们的应用中获得预期结果,我必须采取以下一些方法。

重要的位置更新 - 一旦您的应用因某种您无法控制的原因完成后唤醒您的应用非常好,因此即使您失去了一些分数,它也会在几秒钟/几分钟内恢复。 如果您需要良好的准确性,这并不好,因为您无法控制距离/时间或其他任何东西,iOS 将在移动天线更换、wifi 连接、关闭和打开飞行模式时更新位置,但不会给出 gps 序列点。

开始位置更新 - 精度最高,但耗电。所以你不能只是打开它让它走。您必须对其实施一些控制。

后台任务 - 我发现让我的应用保持活力的唯一方法。

你可以结合的方式是:

  • 已隔离 2 位位置管理器,一位用于重大位置更改,另一位用于开始更新位置;
  • 在两者都打开的情况下启动您的应用;
  • 在您的 didUpdateLocations 中,您可以创建启动和停止后台任务的逻辑;
  • 创建方法来启动和暂停您的位置管理器,并创建计时器来控制它;
  • 在您的 bg 任务中,您将启动或暂停更新位置,但永远不要停止它,例如,如果您的用户注销并且您想停止位置;
  • 让重要的位置更新位置管理器永远保持活力,如果由于某种原因 iOS 决定在 bg 中终止您的应用,它将确保您的应用在特定时刻恢复活力;
  • 对于电池供电,尽量不要使用kCLLocationAccuracyBestForNavigation 来获得准确性,因为它在启动时会消耗大量资源,大多数情况下,kCLLocationAccuracyBest 就足够了,如果你可以使用kCLLocationAccuracyNearestTenMeters;
  • 你的didUpdateLocations会给你很多分数,试着只得到那些好的horizontalAccuracy,对我们来说大约20米就足够了,所以让它发挥作用,一旦你有一个准确的分数,您可以再次暂停。

下面有一些链接对我实施我们的解决方案有很大帮助,这些链接都没有“原样”解决方案,正如我所说,我必须将所有这些链接混合并进行大量测试以了解其行为并制作必要的调整。

https://github.com/voyage11/Location

http://mobileoop.com/background-location-update-programming-for-ios-7

http://zaachi.com/2013/09/30/ios-locationmanager-location-update-in-my-own-interval-with-application-in-the-background.html

【讨论】:

    【解决方案3】:

    除了马克的回答,我希望您探索pausesLocationUpdatesAutomatically,它可以帮助您在用户停止时节省电池电量Apple Documentation

    允许位置管理器暂停更新可以在不牺牲位置数据的情况下延长目标设备的电池寿命。当此属性设置为 true 时,位置管理器会在位置数据不太可能更改时暂停更新(并关闭适当的硬件)。例如,如果用户在使用导航应用时停下来吃东西,位置管理器可能会暂停更新一段时间。您可以通过为 activityType 属性分配一个值来帮助确定何时暂停位置更新。

    【讨论】:

    • 感谢 sheetal,pausesLocationUpdatesAutomatically 将是完美的解决方案,但它的实施非常糟糕,因为一旦系统暂停更新,那么您有责任稍后重新启动它......以及如何做到这一点应用在后台??
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多