web-dev-qa-db-ja.com

iOSでバッテリーヘルス情報を取得する

現在、アプリストアには次のようなアプリがあります(脱獄は必要ありません)。

  1. IPhoneのバッテリーレベルの正確なパーセンテージ値。私はAppleの公式 コードサンプル を試しましたが、iPhoneの充電と放電のタイミングはわかりますが、5%ステップで値が表示されます。これらのアプリはどのようにしてバッテリーのパーセンテージの正確な値を取得しますか?

  2. Battery Health showのようなアプリケーション

    • 現在の最大容量 vs メーカーの容量
    • 現在の排出率
    • ライフタイムバッテリーサイクルカウント
  3. 同じアプリケーションは、電話が充電中のときのワット単位の充電率(画像を確認)および現在の充電器の電力定格に関する情報も提供します。

Application: Battery Health screenshot 1Application: Battery Health screenshot 2


[UIDevice]が提供する情報がほとんどなく、バッテリーの状態とパフォーマンスに関する情報がほとんどない場合、これらのアプリケーションはどのようにしてバッテリーの状態に関する詳細を取得しますか。

14
ShayanK

このようなアプリは、OS XではパブリックでiOSではプライベートであるIOKitフレームワークを使用している可能性があります(AppleではAppStoreアプリにプライベートフレームワークを使用することは許可されていませんが、見落とされることもあります)レビュー中)。

サンプルプロジェクトを見ることができます ここ

3
bzz

私は、プライベート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;
}
5
ldoogy

このプロジェクトは、バッテリー情報を見つけるのに役立つ場合があります。

https://github.com/Shmoopi/iOS-System-Services

4
s Hetul