使用Swift获取我MacBook的电池状态

5

我希望设置一个Playground来获取我的MacBook电池状态。

我已经尝试了以下方法:

import Cocoa
import IOKit
import Foundation

var blob = IOPSCopyPowerSourcesInfo()

我目前收到以下错误:

使用未解决的标识符“IOPSCopyPowerSourcesInfo”

1个回答

18

在Playground中它不起作用,但在真实的应用程序中它可以工作。

我无法使用Swift和import IOKit访问IOPowerSources.h头文件,我必须建立一个Objective-C桥接。

这是我的解决方案:

  1. IOKit.framework添加到您的项目中(在Linked Frameworks and Libraries中单击+

  2. 创建一个新的空的.m文件,无论它的名称是什么。然后Xcode会询问是否要创建“桥接头文件”。选择YES。

  3. 忽略.m文件。在Xcode刚刚创建的新的YOURAPPNAME-Bridging-Header.h文件中,添加以下行:#import <IOKit/ps/IOPowerSources.h> (不要在您的Swift文件中添加import IOKit

  4. 现在您可以访问大多数IOPowerSources函数。

示例:

func getBatteryStatus() -> String {
    let timeRemaining: CFTimeInterval = IOPSGetTimeRemainingEstimate()
    if timeRemaining == kIOPSTimeRemainingUnlimited {
        return "Plugged"
    } else if timeRemaining == kIOPSTimeRemainingUnknown {
        return "Recently unplugged"
    } else {
        let minutes = timeRemaining / 60
        return "Time remaining: \(minutes) minutes"
    }
}

let batteryStatus = getBatteryStatus()
print(batteryStatus)

另一个示例,使用IOPSCopyPowerSourcesInfo

let blob = IOPSCopyPowerSourcesInfo()
let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue())
print(list.takeRetainedValue())

建议在函数结束时释放所有保留的 CFValues(此处为 blob 和 list):

CFRelease(value) >> 在这里:CFRelease(blob) & CFRelease(list)

结果:

(
{ "Battery Provides Time Remaining" = 1;
BatteryHealth = Good;
Current = 0;
"Current Capacity" = 98;
DesignCycleCount = 1000;
"Hardware Serial Number" = 1X234567XX8XX;
"Is Charged" = 1;
"Is Charging" = 0;
"Is Present" = 1;
"Max Capacity" = 100;
Name = "InternalBattery-0";
"Power Source State" = "AC Power";
"Time to Empty" = 0;
"Time to Full Charge" = 0;
"Transport Type" = Internal;
Type = InternalBattery;
}
)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接