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

Ios 采用什么策略来监控用户在后台的位置?,ios,core-location,cllocationmanager,Ios,Core Location,Cllocationmanager,我想在后台跟踪用户的位置,目的是在他靠近朋友时向他显示警报 所以我从CLLocationManager开始。据我所知,即使用户重新启动Iphone或关闭应用程序,他们也只是让应用程序知道位置更新的唯一可靠方法:startMonitoringSignificantLocationChanges。但问题是,即使在一个有很多wifi的城市里,startMonitoringSignificantLocationChanges也会在用户移动1公里左右时启动DidUpdateLocations,这对我来说实

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

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

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

所以问题是:我可以在我的应用程序中使用什么策略来高效地跟踪,而不需要消耗太多的电池全天跟踪用户位置?我需要100米左右的准确度,如果可能的话,每条赛道的间隔为2.5-5分钟(我没有找到任何选项来指定在到达新位置之前等待的延迟)

事实上,我认为这样做:

  • 2
    locationManager
    、1GPS和1重大变化
  • 当应用程序启动时,我使用重要更改位置管理器
    开始监视重要位置更改
    开始监视访问
  • 我还调用GPSLocationManager
    startUpdatingLocation
    来检索准确的用户位置。我设置了
    pauseslocationupdates自动(true)
    ,以便GPSLocationManager可以很快或很晚自行停止
  • dUpdateLocations
    GPSLocationManager提出的I开始监测区域进入/退出(在获得的纬度/经度周围100米半径),使用显著变化sLocationManager

您对这种策略有何看法?

尽管您将收到比您需要的更多的触发器,正如您已经说过的,您可以使用
startMonitoringSignificantLocationChanges
。它是以一种非常节能的方式实现的。它允许应用程序被终止,并且只有当iOS认为设备已经显著移动时才被再次唤醒。另一个优点是,你的应用程序不需要位置背景模式,这可能会在应用程序审查期间引发问题

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

您还可以考虑地理围栏,在当前位置周围有一个退出地理区域。但是,重要的位置更新将更加可靠。一旦您已经离开地理围栏,退出地理围栏将不再触发,这可能发生在手机在地理围栏内关闭,而在外部打开时。此解决方案具有不需要背景模式的相同优点


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

除了Mark的答案之外,我希望您能够探索
pausesLocationUpdatesAutomatically
,这可以帮助您在用户停止时节省电池电量


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

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

重要的位置更新-一旦你的应用程序由于某种你无法控制的原因完成,它会很好地唤醒你的应用程序,因此即使你失去了一些分数,它也会在几秒钟/分钟内恢复。 如果你需要一个好的精确度,这是不好的,因为你无法控制距离/时间或任何东西,当移动天线改变、wifi连接、关闭和打开飞机模式时,iOS将更新位置,但不会给出gps点序列

开始位置更新-最佳精度,但电池排水器。所以你不能把它打开,让它走。你必须对它实施一些控制

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

您可以组合的方式是:

  • 隔离两名地点经理,一名负责重大地点变更,另一名负责开始更新地点
  • 启动应用程序时,两者都已打开
  • didUpdateLocations
    中,您可以创建启动和停止后台任务的逻辑
  • 创建启动和暂停位置管理器的方法,并创建计时器来控制它
  • 在您的bg任务中,您将启动或暂停您的更新位置,但永远不会停止更新,例如,您的用户注销,而您希望停止更新位置
  • 保持重要的位置更新位置管理器永远处于活动状态,