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

标签 ios core-location cllocationmanager

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

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

另一方面startUpdatingLocation正在射击DidUpdateLocations以良好的间隔(甚至太多,因为即使用户不移动它也会经常开火 DidUpdateLocations )。但是startUpdatingLocation无法在 iPhone 重启或应用程序被用户杀死的情况下生存。我还怀疑即使精度为 100m,startUpdatingLocation使用大量电池消耗。

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

实际上我想做这样的事情:

  • 2 locationManager , 1 GPS 和 1 重大变化
  • 当应用程序启动时,我使用significantChangesLocationManager:startMonitoringSignificantLocationChangesstartMonitoringVisits
  • 我还调用 GPSLocationManager startUpdatingLocation检索准确的用户位置。我设置了PausesLocationUpdatesAutomatically(true)这样 GPSLocationManager 迟早会自己停下来
  • DidUpdateLocations通过 GPSLocationManager 引发,我开始使用 significantChangesLocationManager 监控区域进入/退出(获取的纬度/经度周围 100m 半径)

您对这样的策略有何看法?

最佳答案

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

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

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

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

关于ios - 采用什么策略来监控后台用户位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45147002/

相关文章:

iOS 10 : CLManager as a separate class - receiving call backs

ios - 当iphone到达某个位置时如何触发警报?

ios - 如何在 ios 9.0 的 swift 4 中使用位置本地化城市语言?

ios磁力计: force display of calibration view

ios - aws s3 sdk for iOS putObjectRegquest to "new"region 不工作

ios - 如何响应 UITextField 上的触摸事件?

ios - 通过单元格中的按钮通过 segue 传递数据……不工作……

ios - 添加 CLLocationDistances

iphone - 在用户允许应用的位置跟踪后调用选择器

ios - 如何像 Instagram 一样将数据从 tableview 传递到 tableview? swift