我希望设置一个Playground来获取我的MacBook电池状态。
我已经尝试了以下方法:
import Cocoa
import IOKit
import Foundation
var blob = IOPSCopyPowerSourcesInfo()
我目前收到以下错误:
使用未解决的标识符“IOPSCopyPowerSourcesInfo”
我希望设置一个Playground来获取我的MacBook电池状态。
我已经尝试了以下方法:
import Cocoa
import IOKit
import Foundation
var blob = IOPSCopyPowerSourcesInfo()
使用未解决的标识符“IOPSCopyPowerSourcesInfo”
在Playground中它不起作用,但在真实的应用程序中它可以工作。
我无法使用Swift和import IOKit
访问IOPowerSources.h
头文件,我必须建立一个Objective-C桥接。
这是我的解决方案:
将IOKit.framework
添加到您的项目中(在Linked Frameworks and Libraries
中单击+
)
创建一个新的空的.m
文件,无论它的名称是什么。然后Xcode会询问是否要创建“桥接头文件”。选择YES。
忽略.m
文件。在Xcode刚刚创建的新的YOURAPPNAME-Bridging-Header.h
文件中,添加以下行:#import <IOKit/ps/IOPowerSources.h>
(不要在您的Swift文件中添加import IOKit
)
现在您可以访问大多数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;
}
)