【问题标题】:Mac - Get Battery/Charging Status (Plugged in or not)Mac - 获取电池/充电状态(插入或未插入)
【发布时间】:2011-04-22 00:14:00
【问题描述】:

我正在构建一个 Mac OSX 应用程序,它需要每分钟轮询一次服务器,如果用户愿意,甚至可以更少。不幸的是,该服务不支持推送...

无论如何,我想为用户提供两个选项:

  1. 电池轮询的轮询间隔
  2. 充电间隔

如何在 Objective C 中获取充电器的状态?我并不真正关心实际百分比,只关心笔记本电脑是否插入。显然,这对于台式机来说无关紧要,因此希望有一个适用于笔记本电脑和台式机的解决方案。

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    查看IOPowerSources API。

    首先拨打IOPSCopyPowerSourcesInfo(),然后拨打IOPSCopyPowerSourcesList() 以获取所有可用电源的列表。 IOPSGetPowerSourceDescription() 将返回包含有关特定电源信息的字典。根据文档,kIOPSPowerSourceStateKey 键描述了“当前电源。kIOPSBatteryPowerValue 表示电源正在消耗内部电源;kIOPSACPowerValue 表示电源已连接到外部电源。”

    您也可以使用IOPSNotificationCreateRunLoopSource()设置电源更改时的通知。

    (注意:我没有测试任何这些,只是查看了文档。)

    【讨论】:

    • IOPSCopyExternalPowerAdapterDetails() 似乎是一个更好的匹配:“如果没有连接(交流/外部电源)适配器,或者如果出现错误,则返回 NULL。”
    【解决方案2】:

    虽然这个问题已经有了一个公认的答案,这让我找到了我的解决方案,但点击大量断开的链接是很痛苦的。

    这是我的解决方案:

    1. 添加IOKit.framework
    2. 导入#import <IOKit/ps/IOPowerSources.h>
    3. 代码:

      CFTimeInterval timeRemaining = IOPSGetTimeRemainingEstimate();
      
      if (timeRemaining == kIOPSTimeRemainingUnlimited) {
              // connected to outlet
      } else if (timeRemaining == kIOPSTimeRemainingUnknown){
              // time remaining unknown (recently unplugged)
      } else if ((timeRemaining / 60) < 30){
              // less than 30 minutes remaining
      }
      

    【讨论】:

    • -2(充电器已插入)和 -1 充电器已拔出,否则电池寿命会延长几秒
    • 这对我来说非常有效,而且更加清晰。
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多