在 iOS 上获取电池健康信息
Getting Battery Health Information on iOS
应用商店中目前有应用程序(因此不需要越狱)告诉您:
您 iPhone 上电池电量的确切百分比值。我
已经尝试过 Apple 的官方 Code Sample,虽然它会告诉您您的 iPhone 何时充电和放电,但它以 5% 的步长给出了我的值。这些应用程序如何获得 电池百分比 的精确值?
类似 Battery Health 的应用显示
- 当前最大容量 对比 制造商容量
- 当前放电率
- 电池寿命周期计数
同一应用程序还提供有关 phone 充电时的 充电率(瓦特) 和电流 [=28] 的信息=]充电器的额定功率。
当 [UIDevice] 提供的有关电池健康的信息如此之少,几乎没有关于电池健康和性能的信息时,这些应用程序如何获得如此多的关于电池健康的详细信息。
此类应用程序可能使用 IOKit 框架,该框架在 OS X 上是 public 但在 iOS 上是私有的(Apple 不允许将私有框架用于 App Store应用程序,尽管有时在审核过程中可能会忽略它)。
您可以查看示例项目here。
这个项目可以帮助您找出电池信息。
我已经开发了一个解决方案,允许您在不调用任何私人 API 调用的情况下获取此信息(尽管我当然不能向您保证 Apple 会批准它)。
虽然相关信息确实来自 IOKit,但我找到了一种不依赖 IOKit 的获取方式。我的解决方案绝对不依赖于任何类型的私有 API。相反,我开发了一个名为 UIDeviceListener
的组件,它有效地劫持了来自 UIDevice
.
的 IOKit 数据。
试试吧,我整理了一个简单的示例程序:https://github.com/eldoogy/PowerData
例如,这是它检索的 IOKit 字典的样子(请注意,它可能因 iOS 版本和设备型号、世代等而异):
{
AdapterDetails = {
Amperage = 1000;
Description = "usb host";
FamilyCode = "-536854528";
PMUConfiguration = 1000;
Watts = 5;
};
AdapterInfo = 16384;
Amperage = 1000;
AppleRawCurrentCapacity = 1279;
AppleRawMaxCapacity = 1275;
AtCriticalLevel = 0;
AtWarnLevel = 0;
BatteryData = {
BatterySerialNumber = REDACTED;
ChemID = 355;
CycleCount = 524;
DesignCapacity = 1420;
Flags = 640;
FullAvailableCapacity = 1325;
ManufactureDate = REDACTED;
MaxCapacity = 1273;
MfgData = REDACTED;
QmaxCell0 = 1350;
StateOfCharge = 100;
Voltage = 4194;
};
BatteryInstalled = 1;
BatteryKey = "0003-default";
BootBBCapacity = 52;
BootCapacityEstimate = 2;
BootVoltage = 3518;
CFBundleIdentifier = "com.apple.driver.AppleD1815PMU";
ChargerConfiguration = 990;
CurrentCapacity = 1275;
CycleCount = 524;
DesignCapacity = 1420;
ExternalChargeCapable = 1;
ExternalConnected = 1;
FullyCharged = 1;
IOClass = AppleD1815PMUPowerSource;
IOFunctionParent64000000 = <>;
IOGeneralInterest = "IOCommand is not serializable";
IOInterruptControllers = (
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000
);
IOInterruptSpecifiers = (
<03000000>,
<26000000>,
<04000000>,
<24000000>
);
IOMatchCategory = AppleD1815PMUPowerSource;
IOPowerManagement = {
CurrentPowerState = 2;
DevicePowerState = 2;
MaxPowerState = 2;
};
IOProbeScore = 0;
IOProviderClass = AppleD1815PMU;
InstantAmperage = 0;
IsCharging = 0;
Location = 0;
Manufacturer = A;
MaxCapacity = 1275;
Model = "0003-A";
Serial = REDACTED;
Temperature = 2590;
TimeRemaining = 0;
UpdateTime = 1461830702;
Voltage = 4182;
"battery-data" = {
"0003-default" = <...>;
"0004-default" = <...>;
"0005-default" = <...};
"built-in" = 1;
}
应用商店中目前有应用程序(因此不需要越狱)告诉您:
您 iPhone 上电池电量的确切百分比值。我 已经尝试过 Apple 的官方 Code Sample,虽然它会告诉您您的 iPhone 何时充电和放电,但它以 5% 的步长给出了我的值。这些应用程序如何获得 电池百分比 的精确值?
类似 Battery Health 的应用显示
- 当前最大容量 对比 制造商容量
- 当前放电率
- 电池寿命周期计数
同一应用程序还提供有关 phone 充电时的 充电率(瓦特) 和电流 [=28] 的信息=]充电器的额定功率。
当 [UIDevice] 提供的有关电池健康的信息如此之少,几乎没有关于电池健康和性能的信息时,这些应用程序如何获得如此多的关于电池健康的详细信息。
此类应用程序可能使用 IOKit 框架,该框架在 OS X 上是 public 但在 iOS 上是私有的(Apple 不允许将私有框架用于 App Store应用程序,尽管有时在审核过程中可能会忽略它)。
您可以查看示例项目here。
这个项目可以帮助您找出电池信息。
我已经开发了一个解决方案,允许您在不调用任何私人 API 调用的情况下获取此信息(尽管我当然不能向您保证 Apple 会批准它)。
虽然相关信息确实来自 IOKit,但我找到了一种不依赖 IOKit 的获取方式。我的解决方案绝对不依赖于任何类型的私有 API。相反,我开发了一个名为 UIDeviceListener
的组件,它有效地劫持了来自 UIDevice
.
试试吧,我整理了一个简单的示例程序:https://github.com/eldoogy/PowerData
例如,这是它检索的 IOKit 字典的样子(请注意,它可能因 iOS 版本和设备型号、世代等而异):
{
AdapterDetails = {
Amperage = 1000;
Description = "usb host";
FamilyCode = "-536854528";
PMUConfiguration = 1000;
Watts = 5;
};
AdapterInfo = 16384;
Amperage = 1000;
AppleRawCurrentCapacity = 1279;
AppleRawMaxCapacity = 1275;
AtCriticalLevel = 0;
AtWarnLevel = 0;
BatteryData = {
BatterySerialNumber = REDACTED;
ChemID = 355;
CycleCount = 524;
DesignCapacity = 1420;
Flags = 640;
FullAvailableCapacity = 1325;
ManufactureDate = REDACTED;
MaxCapacity = 1273;
MfgData = REDACTED;
QmaxCell0 = 1350;
StateOfCharge = 100;
Voltage = 4194;
};
BatteryInstalled = 1;
BatteryKey = "0003-default";
BootBBCapacity = 52;
BootCapacityEstimate = 2;
BootVoltage = 3518;
CFBundleIdentifier = "com.apple.driver.AppleD1815PMU";
ChargerConfiguration = 990;
CurrentCapacity = 1275;
CycleCount = 524;
DesignCapacity = 1420;
ExternalChargeCapable = 1;
ExternalConnected = 1;
FullyCharged = 1;
IOClass = AppleD1815PMUPowerSource;
IOFunctionParent64000000 = <>;
IOGeneralInterest = "IOCommand is not serializable";
IOInterruptControllers = (
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000
);
IOInterruptSpecifiers = (
<03000000>,
<26000000>,
<04000000>,
<24000000>
);
IOMatchCategory = AppleD1815PMUPowerSource;
IOPowerManagement = {
CurrentPowerState = 2;
DevicePowerState = 2;
MaxPowerState = 2;
};
IOProbeScore = 0;
IOProviderClass = AppleD1815PMU;
InstantAmperage = 0;
IsCharging = 0;
Location = 0;
Manufacturer = A;
MaxCapacity = 1275;
Model = "0003-A";
Serial = REDACTED;
Temperature = 2590;
TimeRemaining = 0;
UpdateTime = 1461830702;
Voltage = 4182;
"battery-data" = {
"0003-default" = <...>;
"0004-default" = <...>;
"0005-default" = <...};
"built-in" = 1;
}