由于后台获取,电池状态和电量?

Battery state and level thanks to the background fetch?

我想知道应用程序的用户何时插入或拔下他的 phone 的充电器,即使应用程序在后台也是如此。我可以通过 NetworkReachability(wifi、ondata、不可访问、不确定...)来做到这一点,但不能通过电池电量或电池状态来做到这一点。 只有当应用程序在前台或处于活动状态时,我才能知道电池电量和电池状态,这与她在后台时不同。

我可以为电池电量(或状态)设置后台获取吗?如果用户拔下充电器,我会启动一个功能或打印(或其他)。

我可以根据电池电量或状态设置监听器吗?因为这就是我为 NetworkReachability 所做的,但我发现只有观察者可用于电池特性。

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if let a = window?.rootViewController as? UIViewController{
            UIDevice.current.isBatteryMonitoringEnabled = true
            NotificationCenter.default.addObserver(self, selector: #selector(self.batteryStateDidChange), name: .UIDeviceBatteryStateDidChange, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(self.batteryLevelDidChange), name: .UIDeviceBatteryLevelDidChange, object: nil)
            completionHandler(.newData)
        }

    else{
        completionHandler(.noData)
    }

而且观察者似乎无法使用后台获取或者我的判断有误?

非常感谢您的帮助,祝大家有个愉快的一天!

我建议检查 article iOS 中可用的后台模式,它解释了有哪些后台模式以及它们的用途。

Apple 主要不使用核心运动来检测驾驶时,只要我的 phone 通过蓝牙连接到汽车,它就知道我在开车,甚至在我移动之前。对你的两个问题的简短回答是......

当您的应用程序处于后台时,它并不是真正的 运行ning。它处于暂停状态。当你第一次为它做背景时,你有很短的时间可以在它完全背景化之前做一些事情,但时间不长。一旦进入后台,您只能在后台获取、控制音频(在后台之前已经在应用程序中启动)、GPS 位置更新和推送通知(我认为是所有这些)中执行操作。

因此,您不能 运行 在后台长时间执行 运行ning 任务来监控电池电量或使用核心运动来检测运动。您可以使用 GPS,如果速度增加超过您预期人类可以达到的速度,那么您可以假设他们正在开车。

根据已接受的答案,看起来情况并非如此,但这些类型的问题通常归结为试图 defer/cancel 密集但可自由裁量的工作。 如果 恰好是这种情况,我就很幸运地使用了 NSProcessInfo 低功耗 API。甚至还有关于何时启用的通知,这对于取消特别有用。