2016-03-15 52 views
13

電池健康信息目前應用時在應用程序商店(所以它不需要越獄),告訴你:你在你的iPhone電池電量的獲取iOS上

  1. 精確的百分比值。 I 已經嘗試過蘋果的官方Code Sample,雖然它告訴你你的iPhone何時充電和放電,但是它給了我5%的值。這些應用程序如何獲得電池百分比的精確值?

  2. 應用,如Battery Health顯示

    • 目前最大容量 VS 製造商的能力
    • 電流放電率
    • 壽命電池的循環次數
  3. 同一個應用程序還提供了有關充電速率,當手機正在充電時(檢查圖像)和當前充電器的額定功率信息。

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


這些應用程序獲取有關電池的健康如此多的細節時,[的UIDevice]提供了有關它這麼少的信息和對電池的健康和性能上幾乎沒有信息怎麼辦。

+0

不知道。但是,如果您在Mac上下載應用程序並將其解壓縮,那麼'nm'命令可能會提供一些有用的信息。 –

回答

2

這樣的應用很可能使用IOKit框架,它在OS X上是公開的,但是在iOS上是私有的(Apple不允許使用App Store應用的私有框架,儘管有時它可能會在審查期間被忽略) 。

您可以看到一個示例項目here

5

我已經開發了一個解決方案,讓您無需調用任何私有的API調用獲得該信息(雖然我當然不能答應你,蘋果將批准它)。

雖然有問題的信息確實源自IOKit,但我找到了一種不依賴於IOKit的方法。我的解決方案完全不依賴任何類型的私有API。相反,我開發了一個名爲UIDeviceListener的組件,可以有效地劫持來自的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; 
} 
+4

不適用於ios 10 – Shohrab

+1

這是正確的。 iOS 10有兩個變化。首先,他們對代碼的結構進行了修改,似乎是故意禁用了'UIDeviceListener'。然後他們還從IOKit中刪除了大部分數據,並保留了確定電池百分比所需的鍵。恐怕我們無能爲力。 :-( – ldoogy