iOS:应用程序暂停状态中的位置更新

时间:2017-12-29 10:57:28

标签: ios swift gps core-location cllocationmanager

当应用程序处于挂起/终止状态时,是否可以更新位置。

当应用程序处于暂停/终止状态时,我想每500米更新一次位置。

提前感谢。

2 个答案:

答案 0 :(得分:0)

终止时获取更新的唯一真正方法是使用区域监控,但您只会获得重大更新,因此我怀疑它能在500米内工作。

来自文档:

  

如果您的应用由用户或系统终止,则   系统在新位置时无法自动重启您的应用   更新到达。用户必须在之前明确重新启动您的应用   地点更新的交付恢复。拥有应用程序的唯一方法   自动重新启动是使用区域监控或   重大变化的位置服务。但是,当用户禁用时   后台应用程序刷新设置全局或专门用于   您的应用,系统不会针对任何位置重新启动您的应用   事件,包括重大变化或区域监测事件。   此外,当后台应用程序刷新关闭时,您的应用程序将无法接收   重大变化或区域监测事件,即使它在   前景。

这有充分的理由。首先,人们不希望应用程序“窥探”。在他们身上,即使有充分的理由想象有10个应用程序不断地这样做。它将开始导致性能和电池寿命问题。

修改 很多人对这个问题似乎有些困惑所以我会尝试清理一下。

您的应用不应该在终止(或真正暂停)时持续跟踪位置。出于隐私原因,您不允许这样做,因此您不会过度耗尽电池。

当您的应用位于前台时,您可以通过startUpdatingLocation使用位置服务来监控设备位置。假设该应用已获得许可,则将使用所有可用硬件(GPS,WiFi,移动电话)。

现在来自文档本身:

  

如果您启动此服务并且您的应用已暂停,则系统会停止   交付事件,直到您的应用程序再次开始运行(在...中)   前景或背景)。如果您的应用程序被终止,则交付   新的位置事件完全停止。因此,如果您的应用需要   要在后台接收位置事件,它必须包括   其Info.plist中的UIBackgroundModes键(具有位置值)   文件。

因此,一旦暂停和终止,您的选项实际上是监控区域并监控重要的位置变化。这些都不是特别准确或频繁。其中一个原因是他们只使用低功耗方法来获取他们不使用GPS的位置(WiFi和Cellular)。

因此暂停或终止应用时,不会进行准确和/或频繁的位置跟踪。这只是必须接受,您需要相应地设计您的应用程序。

答案 1 :(得分:0)

let locationManager = CLLocationManager()
locationManager.startMonitoringSignificantLocationChanges()

在返回当前位置修复后,接收器仅在检测到用户位置发生重大变化时才生成更新事件。它不依赖distanceFilter属性中的值来生成事件

如果您启动此服务并且您的应用随后终止,则系统会在新事件到来时自动将应用重新启动到后台。在这种情况下,传递给应用程序代理的应用程序字典(:willFinishLaunchingWithOptions :)和应用程序(:didFinishLaunchingWithOptions :)方法包含关键位置,以指示您的应用程序是由于位置事件。重新启动后,您仍必须配置位置管理器对象并调用此方法以继续接收位置事件。重新启动位置服务时,会立即将当前事件传递给您的代理。此外,即使在启动位置服务之前,也会使用最新的位置对象填充位置管理器对象的位置属性。

Apps can expect a notification as soon as the device moves 500 meters or more from its previous notification. It should not expect notifications more frequently than once every five minutes. If the device is able to retrieve data from the network, the location manager is much more likely to deliver notifications in a timely manner.

希望有所帮助