Подтвердить что ты не робот

Получение информации о работоспособности аккумулятора в iOS

В настоящее время приложения в магазине приложений (так что он не требует джейлбрейка), которые сообщают вам:

  • Точное процентное значение уровня заряда аккумулятора на вашем iPhone. я пробовал Apple официальный Пример кода, хотя он сообщает вам, когда ваш iPhone заряжается и разряжается, но он дает мне значения с шагом 5%. Как эти приложения получают точные значения доли аккумулятора?

  • Приложения, такие как Battery Health show

    • Текущая максимальная емкость vs Производительность
    • Текущая скорость разряда
    • Срок службы аккумулятора
  • В том же приложении также содержится информация о скорости зарядки в ваттах, когда телефон заряжается (проверьте изображения) и текущий рейтинг мощности зарядного устройства.

Приложение: Снимок экрана батареи 1 Приложение: Снимок экрана батареи 2


Как эти приложения получают подробную информацию о состоянии батареи, когда [UIDevice] предоставляет такую ​​небольшую информацию об этом и почти никакой информации о качестве и работоспособности батареи.

4b9b3361

Ответ 1

Вероятно, что такие приложения используют инфраструктуру IOKit, которая является общедоступной в OS X, но закрыта для iOS (Apple не разрешает использовать частные фреймворки для приложений App Store, хотя иногда ее можно игнорировать во время обзора).

Вы можете увидеть пример проекта здесь.

Ответ 2

Я разработал решение, которое позволит вам получить эту информацию, не вызывая никаких частных вызовов API (хотя я, конечно же, не мог обещать, что Apple одобрит ее).

Хотя информация, о которой идет речь, исходит из IOKit, я нашел способ ее получить, не полагаясь на IOKit. Мое решение не использует абсолютно никаких частных API. Вместо этого я разработал компонент под названием UIDeviceListener, который эффективно захватывает данные IOKit из 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;
}