Obtener información de salud de la batería en iOS

Actualmente hay aplicaciones en la app-store (por lo que no requiere jailbreak) que te dicen:

  1. Valor de porcentaje exacto del nivel de batería que tiene en su iPhone. He intentado el Ejemplo de código oficial de Apple, aunque le indica cuándo su iPhone se está cargando y descargando, pero me da valores en pasos del 5%. ¿Cómo obtienen estas aplicaciones valores exactos del porcentaje de batería ?

  2. Aplicaciones como Battery Health show

    • Capacidad máxima actual frente a la capacidad del fabricante
    • Tasa de descarga actual
    • Ciclo de batería de por vida
  3. La misma aplicación también proporciona información sobre la tasa de carga en vatios cuando el teléfono se está cargando (imágenes de verificación) y la sorting de potencia del cargador actual.

Aplicación: captura de pantalla de Battery Health 1 Aplicación: captura de pantalla de Battery Health 2


¿Cómo estas aplicaciones obtienen tantos detalles sobre la salud de la batería cuando [UIDevice] proporciona tan poca información al respecto y casi no hay información sobre el estado y el performance de la batería.

Es probable que dichas aplicaciones utilicen IOKit framework, que es público en OS X pero privado en iOS (Apple no permite que utilice frameworks privados para aplicaciones de App Store, aunque a veces puede pasarse por alto durante la revisión).

Puedes ver un proyecto de ejemplo aquí .

He desarrollado una solución que le permitirá get esta información sin invocar ninguna llamada API privada (aunque ciertamente no podría prometerle que Apple la aprobaría).

Si bien la información en cuestión tiene su origen en IOKit, he encontrado una manera de getla sin depender de IOKit. Mi solución se basa en absolutamente ninguna API privada de ningún tipo. En su lugar, desarrollé un componente llamado UIDeviceListener que secuestra eficazmente los datos de UIDevice de UIDevice .

Pruébelo, he creado un progtwig de ejemplo simple: https://github.com/eldoogy/PowerData

A modo de ejemplo, esto es lo que tiende a parecer el dictionary de IOKit que recupera (tenga en count que puede variar según las versiones de iOS y por model de dispositivo, generación, etc.):

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

Este proyecto puede ayudarlo a descubrir la información de la batería.

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