【问题标题】:Fetch the battery status of my MacBook with Swift使用 Swift 获取我的 MacBook 的电池状态
【发布时间】:2015-07-26 04:02:51
【问题描述】:
我想设置一个 Playground 来获取我的 macbook 的电池状态。
我已经尝试了以下方法:
import Cocoa
import IOKit
import Foundation
var blob = IOPSCopyPowerSourcesInfo()
我目前收到如下错误
使用未解析的标识符“IOPSCopyPowerSourcesInfo”
【问题讨论】:
标签:
macos
swift
cocoa
battery
batterylevel
【解决方案1】:
它在 Playground 中不起作用,但在实际应用中起作用。
我无法仅使用 Swift 和 import IOKit 访问 IOPowerSources.h 头文件,但是:我必须搭桥到 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)
注意:我无法访问像 kIOPSTimeRemainingUnlimited 和 kIOPSTimeRemainingUnknown 这样的常量,所以我使用了它们的原始值(-2.0 和 -1.0),但如果它们仍然存在于某个地方,最好找到这些常量。
另一个例子,IOPSCopyPowerSourcesInfo:
let blob = IOPSCopyPowerSourcesInfo()
let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue())
print(list.takeRetainedValue())
结果:
(
{
"电池提供剩余时间" = 1;
BatteryHealth = 好;
当前 = 0;
“当前容量” = 98;
设计周期计数 = 1000;
"硬件序列号" = 1X234567XX8XX;
“已收费”= 1;
“正在充电”= 0;
“存在”= 1;
“最大容量”= 100;
名称 = "InternalBattery-0";
“电源状态”=“交流电源”;
“清空时间”= 0;
“充满电的时间”= 0;
“传输类型”= 内部;
类型 = 内置电池;
}
)