我想设置一个Playground,以获取Macbook的电池状态。

我已经尝试了以下方法:

import Cocoa
import IOKit
import Foundation

var blob = IOPSCopyPowerSourcesInfo()

我目前收到如下错误

最佳答案

它不适用于 Playground,但它适用于真正的应用程序。

但是,我无法仅使用 Swift 和 IOPowerSources.h 访问 import IOKit 头文件:我必须为 Objective-C 搭建桥梁。

这是我的解决方案:

  • IOKit.framework 添加到您的项目中(单击 + 中的 Linked Frameworks and Libraries )
  • 创建一个新的空 .m 文件,不管它的名字是什么。然后 Xcode 会询问它是否应该制作一个“桥接头”。说是。
  • 忽略 .m 文件。在Xcode刚刚创建的新的YOURAPPNAME-Bridging-Header.h文件中,添加#import <IOKit/ps/IOPowerSources.h>行(并且不要在您的Swift文件中添加import IOKit)
  • 您现在可以访问大部分 IOPowerSources 函数。

  • 示例:
    func getBatteryStatus() -> String {
        let timeRemaining: CFTimeInterval = IOPSGetTimeRemainingEstimate()
        if timeRemaining == -2.0 {
            return "Plugged"
        } else if timeRemaining == -1.0 {
            return "Recently unplugged"
        } else {
            let minutes = timeRemaining / 60
            return "Time remaining: \(minutes) minutes"
        }
    }
    
    let batteryStatus = getBatteryStatus()
    print(batteryStatus)
    

    注意:我无法访问像 kIOPSTimeRemainingUnlimitedkIOPSTimeRemainingUnknown 这样的常量,所以我使用了它们的原始值(-2.0 和 -1.0),但如果它们仍然存在于某处,最好找到这些常量。

    另一个例子 ,带有 IOPSCopyPowerSourcesInfo :
    let blob = IOPSCopyPowerSourcesInfo()
    let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue())
    print(list.takeRetainedValue())
    

    结果:

    10-08 07:23