【发布时间】:2018-06-09 19:54:33
【问题描述】:
当应用程序处于挂起/终止状态时是否可以更新位置。
当应用程序处于暂停/终止状态时,我想每 500 米更新一次位置。
提前致谢。
【问题讨论】:
标签: ios swift gps core-location cllocationmanager
当应用程序处于挂起/终止状态时是否可以更新位置。
当应用程序处于暂停/终止状态时,我想每 500 米更新一次位置。
提前致谢。
【问题讨论】:
标签: ios swift gps core-location cllocationmanager
终止后,获取更新的唯一真正方法是使用区域监控,但您只会获得重大更新,所以我怀疑它是否能在 500 米范围内工作。
来自文档:
如果您的应用被用户或系统终止,则 新位置时系统不会自动重新启动您的应用程序 更新到达。用户必须在 恢复位置更新的交付。拥有您的应用程序的唯一方法 自动重新启动是使用区域监控或 重大变化的定位服务。但是,当用户禁用 后台应用程序刷新设置全局或专门用于 您的应用程序,系统不会在任何位置重新启动您的应用程序 事件,包括重大变化或区域监控事件。 此外,当后台应用刷新关闭时,您的应用将不会收到 重大变化或区域监控事件,即使它在 前景。
这是有充分理由的。首先,人们不想要一直“窥探”他们的应用程序,即使有充分的理由想象有 10 个应用程序经常这样做。它会开始给您带来性能和电池寿命问题。
编辑 很多人似乎对这个问题有些困惑,所以我会尝试澄清一下。
您的应用不应在终止(或真正暂停)时持续跟踪位置。出于隐私原因,您不得这样做,以免过度消耗电池电量。
当您的应用处于前台时,您可以通过 startUpdatingLocation 使用定位服务来监控设备位置。假设应用已获得许可,这将使用所有可用的硬件(GPS、WiFi、蜂窝网络)。
现在从文档本身来看:
如果您启动此服务并且您的应用被暂停,系统将停止 事件的传递,直到您的应用程序再次开始运行(无论是在 前景或背景)。如果您的应用程序被终止,交付 的新位置事件完全停止。因此,如果您的应用需要 要在后台接收位置事件,它必须包括 其 Info.plist 中的 UIBackgroundModes 键(带有位置值) 文件。
因此,一旦暂停和终止,您的选择实际上就是监控区域并监控重大位置变化。这些都不是特别准确或频繁。造成这种情况的一个原因是他们只使用低功耗方法来获取他们不使用 GPS 的位置(WiFi 和蜂窝网络)。
因此,当应用暂停或终止时,不会进行准确和/或频繁的位置跟踪。只需接受这一点,您就需要相应地设计您的应用程序。
【讨论】:
let locationManager = CLLocationManager()
locationManager.startMonitoringSignificantLocationChanges()
在返回当前位置修复后,接收器仅在检测到用户位置发生重大变化时才会生成更新事件。它不依赖 distanceFilter 属性中的值来生成事件
如果您启动此服务并且您的应用随后被终止,则系统会在新事件到达时自动将应用重新启动到后台。在这种情况下,传递给应用程序委托的 application(:willFinishLaunchingWithOptions:) 和 application(: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.
希望对你有帮助
【讨论】: