使用Swift获取MacBook的电池状态

Maa*_*uri 4 macos cocoa battery batterylevel swift

我想设置一个Playground来获取我的macbook的电池状态.

我已经尝试过以下方法:

import Cocoa
import IOKit
import Foundation

var blob = IOPSCopyPowerSourcesInfo()
Run Code Online (Sandbox Code Playgroud)

我目前收到如下错误

使用未解析的标识符'IOPSCopyPowerSourcesInfo'

aya*_*aio 13

它在Playground中不起作用,但它可以在真实的应用程序中运行.

我无法IOPowerSources.h使用Swift 访问头文件import IOKit,但是:我必须建立一个与Objective-C的桥梁.

这是我的解决方案:

  1. 添加IOKit.framework到您的项目(点击+Linked Frameworks and Libraries)

  2. 创建一个新的空.m文件,无论其名称如何.然后Xcode将询问它是否应该制作"桥接头".说是的.

  3. 忽略该.m文件.在YOURAPPNAME-Bridging-Header.hXcode刚创建的新文件中,添加行#import <IOKit/ps/IOPowerSources.h> (并且不要添加import IOKit到Swift文件中)

  4. 您现在可以访问大多数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)
Run Code Online (Sandbox Code Playgroud)

注意:我无法访问常量kIOPSTimeRemainingUnlimited,kIOPSTimeRemainingUnknown因此我使用了它们的原始值(-2.0和-1.0),但如果它们仍存在于某处,最好找到这些常量.

另一个例子,有IOPSCopyPowerSourcesInfo:

let blob = IOPSCopyPowerSourcesInfo()
let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue())
print(list.takeRetainedValue())
Run Code Online (Sandbox Code Playgroud)

结果:

=内部; Type = InternalBattery; } )