2016-03-15 21 views
13

Obecnie aplikacje w app-store (więc nie wymaga jailbreak), które wam:Pierwsze Battery Health Informacje o iOS

  1. dokładną wartość procentową poziomu naładowania baterii masz na telefonie iPhone. I wypróbowałem oficjalną wersję Apple Code Sample, chociaż informuje cię, kiedy Twój iPhone ładuje się i rozładowuje, ale daje mi 5% kroków. W jaki sposób te aplikacje uzyskują dokładne wartości procentowe baterii ?

  2. Aplikacje takie jak Battery Health pokazać

    • Aktualny Maksymalna pojemność vs Pojemność producenta
    • prąd rozładowania Oceń
    • Żywotność baterii Cykl Hrabia
  3. Ta sama aplikacja podaje również informacje o współczynniku ładowania w Watach podczas ładowania telefonu (sprawdź obrazy) i aktualnej wartości znamionowej ładowarki.

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


Jak te aplikacje dostać tak wiele szczegółów na temat zdrowia baterii gdy [UIDevice] stanowi tak mało informacji na ten temat i prawie nie ma informacji na temat zdrowia i wydajności baterii.

+0

Nie wiem. Ale jeśli pobierzesz aplikację na Macu i rozpakujesz ją, polecenie 'nm' może dostarczyć użytecznych informacji. –

Odpowiedz

2

Jest prawdopodobne, że takie aplikacje używają struktury IOKit, która jest publiczna na OS X, ale prywatna na iOS (nie jest dozwolone przez Apple do używania prywatnych frameworków dla aplikacji App Store, chociaż czasami można go pominąć podczas przeglądu) .

Możesz zobaczyć przykładowy projekt here.

5

ja stworzyliśmy rozwiązanie, które pozwoli Ci uzyskać te informacje bez wywoływania żadnych prywatnych wywołań API (choć na pewno nie mógł obiecać, Apple będzie go zatwierdzić).

Chociaż informacje, o których mowa, pochodzą z IOKit, znalazłem sposób na uzyskanie go bez polegania na IOKit. Moje rozwiązanie nie opiera się całkowicie na żadnym prywatnym interfejsie API. Zamiast tego opracowałem komponent o nazwie UIDeviceListener, który skutecznie przechwytuje dane IOKit z .

Spróbuj, ja już ułożyła prosty przykładowy program: https://github.com/eldoogy/PowerData

Jako przykład, oto co słownika IOKit pobiera zwykle wygląda (zauważ, że to może się różnić od wersji iOS i według modelu urządzenia, generowania itp.):

{ 
    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; 
} 
+4

nie działa z ios 10 – Shohrab

+1

To prawda. iOS 10 miał dwie zmiany. Przede wszystkim dokonali zmiany w strukturze kodu, który wydaje się celowo wyłączać 'UIDeviceListener'. Następnie usunęli większość danych z IOKit i zachowali tylko klucze niezbędne do określenia odsetka baterii. Niewiele możemy z tym zrobić, obawiam się. :-( – ldoogy