嗨,我想知道如何迅速获得当前的电池容量.
我有这个代码
let batteryStatus = getBatteryStatus() print(batteryStatus) let blob = IOPSCopyPowerSourcesInfo() let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue()) let PowerDetail = list.takeRetainedValue() print(PowerDetail)
这是我的输出
( { "Battery Provides Time Remaining" = 1; BatteryHealth = Good; Current = 3907; "Current Capacity" = 57; DesignCycleCount = 1000; "Is Charging" = 1; "Is Finishing Charge" = 0; "Is Present" = 1; "Max Capacity" = 100; Name = "InternalBattery-0"; "Power Source State" = "AC Power"; "Time to Empty" = 0; "Time to Full Charge" = 120; "Transport Type" = Internal; Type = InternalBattery; }
)
现在我如何获得"当前容量"
谢谢
import Foundation import IOKit.ps // Take a snapshot of all the power source info let snapshot = IOPSCopyPowerSourcesInfo().takeRetainedValue() // Pull out a list of power sources let sources = IOPSCopyPowerSourcesList(snapshot).takeRetainedValue() as Array // For each power source... for ps in sources { // Fetch the information for a given power source out of our snapshot let info = IOPSGetPowerSourceDescription(snapshot, ps).takeUnretainedValue() as! [String: AnyObject] // Pull out the name and capacity if let name = info[kIOPSNameKey] as? String, let capacity = info[kIOPSCurrentCapacityKey] as? Int, let max = info[kIOPSMaxCapacityKey] as? Int { print("\(name): \(capacity) of \(max)") } }
请记住,"当前容量"可能并不意味着您认为这意味着什么.容量单位由供应商定义.Apple电源的发布容量为0-100%,但其他供应商可以提供其他单位的信息(例如mAh).您需要除以最大容量才能获得有意义的结果.
/*! * @define kIOPSCurrentCapacityKey * @abstract CFDictionary key for the current power source's capacity. * * @discussion *
请注意,此代码有点危险.它假设一路上没有错误.如果有错误,你会崩溃.很难想象这里的错误并不表示主要的电力系统故障,在这种情况下,崩溃这个应用程序可能是我们最不关心的问题,但即便如此,更谨慎可能是合理的.如果是这样,你会写这样的东西,这有点复杂,但更安全:
import Foundation import IOKit.ps enum BatteryError: Error { case error } do { // Take a snapshot of all the power source info guard let snapshot = IOPSCopyPowerSourcesInfo()?.takeRetainedValue() else { throw BatteryError.error } // Pull out a list of power sources guard let sources: NSArray = IOPSCopyPowerSourcesList(snapshot)?.takeRetainedValue() else { throw BatteryError.error } // For each power source... for ps in sources { // Fetch the information for a given power source out of our snapshot guard let info: NSDictionary = IOPSGetPowerSourceDescription(snapshot, ps as CFTypeRef)?.takeUnretainedValue() else { throw BatteryError.error } // Pull out the name and current capacity if let name = info[kIOPSNameKey] as? String, let capacity = info[kIOPSCurrentCapacityKey] as? Int, let max = info[kIOPSMaxCapacityKey] as? Int { print("\(name): \(capacity) of \(max)") } } } catch { fatalError() }