采用什么策略来监控后台的用户位置?

时间:2017-07-17 14:33:46

标签: ios core-location cllocationmanager

我想跟踪背景中的用户位置,目的是在他接近他的一位朋友时向他显示提醒。

所以我从CLLocationManager开始。据我所知,即使用户重启Iphone或杀死应用程序,他们只是让应用知道位置更新的一种可靠方式:startMonitoringSignificantLocationChanges。但问题是即使在一个有很多wifi的城市里面,startMonitoringSignificantLocationChanges当用户移动1公里左右时会发出DidUpdateLocations,这对我的需求来说太多了

另一方面startUpdatingLocation以良好的间隔触发DidUpdateLocations(甚至过多,因为即使用户不经常移动它也会DidUpdateLocations)。但是startUpdatingLocation无法生存到iphone重启或app被用户杀死。另外我怀疑即使准确度为100米,startUpdatingLocation也会耗费大量电量。

所以问题:我可以在我的应用中使用哪种策略来有效跟踪,而不会耗费太多电池全时用户位置?我需要大约100米的准确度,如果可能的话,每个轨道的间隔时间在2.5到5分钟之间(我没有找到任何选项来指定在赶上新位置之前等待的延迟)

其实我觉得要这样做:

  • 2 locationManager,1 GPS 和1 重大变化
  • 当应用开始时我使用 significantChangesLocationManager startMonitoringSignificantLocationChangesstartMonitoringVisits
  • 我还调用 GPSLocationManager startUpdatingLocation来检索准确的用户位置。我设置了PausesLocationUpdatesAutomatically(true),以便 GPSLocationManager 将很快或很晚停止
  • on DidUpdateLocations通过 GPSLocationManager 加注我使用 significantChangesLocationManager
  • 开始监控区域进入/退出(获取的纬度/长工具周围100米半径)

您如何看待这种策略?

3 个答案:

答案 0 :(得分:1)

即使你会收到比你需要的更多的触发器,正如你已经说过的那样,你可以使用startMonitoringSignificantLocationChanges。它以非常节能的方式实施。它允许应用程序终止,只有当iOS认为设备已显着移动时才会再次唤醒。另一个优点是您的应用程序不需要位置后台模式,这可能会在应用审核期间引发问题。

startUpdatingLocation让应用程序不断更新设备的位置,即使您只收到几个didUpdateLocations:个活动。此外,iOS在更新处于活动状态时无法关闭应用程序,因此消耗大量电池。

您还可以考虑使用当前位置周围的退出地理围栏进行地理围栏。但是,重要的位置更新将更加可靠。一旦您已经退出地理围栏,退出地理围栏就不会再触发,这可能发生在地理围栏中关闭手机并转回外部时。该解决方案具有不需要后台模式的相同优点。

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

答案 1 :(得分:1)

正如评论中所提到的,为了在我们的应用程序中获得预期的结果,我必须采取一些方法。

重要的位置更新 - 一旦完成后可以通过某些你无法控制的原因唤醒你的应用程序,所以即使你丢失了一些点数,它也会在几秒钟/几分钟内恢复。 如果你需要一个很好的准确度,这是不好的,因为你无法控制距离/时间或其他什么,iOS将更改移动天线更改位置,无线连接,关闭和打开空中飞机模式,但不会给出一系列的GPS分。

开始位置更新 - 最精确但电池滤水器。所以你不能把它打开就可以了。你必须对它实施一些控制。

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

您可以合并的方式是:

  • 隔离了2个位置管理器,一个用于重要的位置更改,另一个用于开始更新位置;
  • 启用您的应用,同时打开;
  • didUpdateLocations内,您可以创建逻辑以启动和停止后台任务;
  • 创建启动和暂停位置管理器的方法,并创建计时器来控制它;
  • 在您的bg任务中,您将启动或暂停更新位置,但永远不要停止,例如,如果您的用户退出并且您想要停止位置;
  • 让重要的位置更新位置管理器永远活着,如果由于某种原因iOS决定在bg中杀死你的应用程序,它将确保在给定的时刻你的应用程序将恢复生机;
  • 对于电池现场,请尝试不要使用kCLLocationAccuracyBestForNavigation来提高准确性,因为它开始时会占用大量资源,大部分时间,kCLLocationAccuracyBest就足够了,如果可以使用{{1 }};
  • 你的kCLLocationAccuracyNearestTenMeters会给你一大堆积分,试着只给那些有良好didUpdateLocations的人,大约20米对我们来说已经足够了,所以让它运作一旦你有一个点准确度很高,你可以再次暂停。

下面你有一些链接帮助我实现了我们的解决方案,其中没有一个有" as"解决方案,正如我所说,我必须混合所有这些并进行大量测试以了解其行为并进行必要的调整。

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

答案 2 :(得分:0)

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

允许位置管理器暂停更新可以延长目标设备的电池寿命,而不会牺牲位置数据。当此属性设置为true时,位置管理器会在位置数据不太可能更改时暂停更新(并关闭相应的硬件)。例如,如果用户在使用导航应用程序时停止食物,则位置管理器可能暂停更新一段时间。您可以通过为activityType属性指定值来帮助确定何时暂停位置更新。