一尘不染

使用Swift获取MacBook的电池状态

swift

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

我已经尝试了以下方法:

import Cocoa
import IOKit
import Foundation

var blob = IOPSCopyPowerSourcesInfo()

我目前收到如下错误

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


阅读 370

收藏
2020-07-07

共1个答案

一尘不染

它在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)

注意:我无法像
这样访问常量kIOPSTimeRemainingUnlimitedkIOPSTimeRemainingUnknown因此我使用了它们的原始值(-2.0和-1.0),但是如果这些常量仍然存在于某个地方,那将更好。

又如 ,具有IOPSCopyPowerSourcesInfo

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

结果:

=内部; 类型= InternalBattery; } )

2020-07-07