【问题标题】:Battery state and level thanks to the background fetch?由于后台获取,电池状态和电量?
【发布时间】:2018-06-19 07:32:09
【问题描述】:

我想知道应用程序的用户何时插入或拔出手机充电器,即使应用程序处于后台也是如此。我可以通过 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)
    }

而且似乎观察者不使用后台提取,或者我说错了?

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

【问题讨论】:

  • 您不能/不应该在后台获取操作中使用观察者或计时器。操作系统会给你一个有限的时间段,让你在操作系统选择的随机时间在后台获取一些数据。预计后台操作应及时返回,因为您获得的时间段会受到限制。如果需要很长时间,操作系统可能会终止该操作,然后不会给您的应用太多(如果有)时间用于未来的后台提取,如果 Apple 检测到您在做什么,他们可能会拒绝您的应用
  • 是的,我知道了,请问如何为电池电量(和状态)设置监听器?
  • 当应用程序处于后台时,您不能这样做。
  • 但我可以这样做来检查网络可达性。如果用户使用 WiFi 或数据,后台获取会告诉我。感谢一位听众....
  • 如果我没记错的话,NetworkReachability 类甚至不是 Apple 类,它是作为 AFNetworking / Alamofire 的一部分构建的。它完全不同。您可以使用UIDevice class 获取电池状态和电量。它具有电池电量和状态的属性。您还可以在不在后台时监视更改

标签: ios swift background fetch battery


【解决方案1】:

根据接受的答案,情况似乎并非如此,但这些类型的问题通常归结为试图推迟/取消密集的、但可以自行决定的工作。 如果恰好是这种情况,我很幸运能够使用NSProcessInfo 低功耗 API。甚至还有关于何时启用的通知,这对于取消特别有用。

【讨论】:

    【解决方案2】:

    我建议查看article 在 iOS 中可用的背景模式,它解释了有哪些背景模式以及您可以将它们用于什么。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多