我正在尝试关注iOS能源指南,让我的应用程序能够识别低功耗模式;为此,我遵循发布的here指南,该指南提供了有关如何订阅此类事件的代码。我已经实现了这个功能,如下所示:
/// Function to subscribe to low-power mode events
///
func subscribeToLowBatteryNotification() {
NotificationCenter.default.addObserver(self,
selector: #selector(lowBatteryHandle),
name: Notification.Name.NSProcessInfoPowerStateDidChange,
object: nil)
}
/// handler for low-power mode events.
///
@objc func lowBatteryHandle(_ notification: Notification) {
let lowPowerModeEnabled = ProcessInfo.processInfo.isLowPowerModeEnabled
if lowPowerModeEnabled {
stopTrackingBackground()
} else {
startTrackingBackground()
}
}
这非常简单。然后我将我的应用程序放在后台,同时根据需要不断跟踪位置;然后我启用低功耗模式和通知 确实收到(在后台)成功提示应用程序暂停跟踪。不幸的是,当低功耗禁用时并且我希望收到类似的状态更改事件(在后台),这不会在后台收到,并且事件仅在应用时传递给应用程序我再次进入应用程序。有谁知道如何在后台接收这些事件?
答案 0 :(得分:0)
当您的应用停止后台跟踪时,系统会移至suspend the application。暂停时,您的应用程序将不会收到通知,即使是低功耗模式的状态。一种策略可能是转移到较低级别的位置投放频率,例如significant location changes,或使用deferred location更新,因为这可能适用于您的用例,也可能不适用。
当用户全局或为您的应用停用后台应用刷新设置时,重要更改位置服务不会重新启动您的应用。此外,在关闭后台应用程序刷新时,即使应用程序位于前台,也不会收到重大更改或区域监视事件。
由于低功耗模式全局禁用后台应用刷新,我认为这意味着可能无法提供重大变化事件。该注释显示“当用户禁用”时,但在低功耗模式下,它不会表示是主要操作还是次要操作。但是,Deferred location会有更新。
Apple在automatically pausing location updates
上的文档中提供了其他指导对于具有使用中授权的应用,暂停到位置更新会结束对位置更改的访问,直到再次启动应用并能够重新启动这些更新。如果您不希望位置更新完全停止,请考虑在应用移动到后台时禁用此属性并将位置精度更改为kCLLocationAccuracyThreeKilometers。这样做可以让您以功能友好的方式继续接收位置更新。
此外,在standard location service的文档中,apple提供了更多指导
要最大限度地降低功耗,请不要将desiredAccuracy属性设置为比实际需要的更高的精度。同样,始终将distanceFilter属性设置为满足应用需求的最大值。系统总是试图为您提供可用的最佳位置数据,但这些属性使系统可以灵活地在不需要时关闭硬件元素。
所有这些信息表明,要在启用低功耗模式时继续接收更新,您必须使用标准服务或延迟服务。为了在启用标准服务时提供强大的功能,您可以通过调整distanceFilter
和desiredAccuracy
属性来重新配置您的经理以减少更新。