获取iOS设备电池健康信息

16

目前在应用商店有些应用程序可以告诉你以下信息(因此不需要越狱):

  1. 你在 iPhone 上的电池电量的确切百分比值。我尝试过苹果官方提供的代码示例,虽然它可以告诉你当你的 iPhone 充电和放电时,但是它以 5% 的步长给出值。这些应用程序如何获得准确的电池百分比值?

  2. Battery Health这样的应用程序显示

    • 当前最大容量制造商容量
    • 当前放电速率
    • 生命周期电池循环计数
  3. 同一应用程序还会在手机充电时提供关于充电功率的信息(请查看图像)和当前充电器的功率评级

应用程序:Battery Health 截图 1 应用程序:Battery Health 截图 2


当 [UIDevice] 提供很少关于电池健康状况的信息,几乎没有关于电池健康和性能的任何信息时,这些应用程序如何获取有关电池健康的如此详细的信息。


不知道。但是如果你在你的Mac上下载并解压这个应用程序,nm命令可能会提供一些有用的信息。 - Tom Harrington
3个回答

5
我已经开发了一个解决方案,可以让您获取此信息而无需调用任何私有API(尽管我肯定不能保证苹果会批准它)。
虽然所涉及的信息确实来自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;
}

1
这是正确的。iOS 10有两个更改。首先,他们对代码结构进行了更改,似乎有意禁用了UIDeviceListener。然后,他们还从IOKit中删除了大部分数据,只保留了确定电池百分比所需的键。恐怕我们无能为力。 :-( - ldoogy

4
很可能此类应用使用IOKit框架,在OS X上是公共的,但在iOS上是私有的(苹果不允许在App Store应用中使用私有框架,尽管有时会在审核过程中忽视此事)。
您可以在此处查看一个示例项目:这里

4

图书馆很棒,这应该被接受为答案。 - Maximilian
这里只有电池电量。这里有一些关于iOS 11和12的讨论,以及关于苹果审核团队拒绝的讨论:https://github.com/eldade/EEIOKitListener/issues/2 - jc_35

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接