How Do I get Battery Charge Cycles from a connected iOS device?

ArtOfWarfare picture ArtOfWarfare · Dec 14, 2013 · Viewed 13.5k times · Source

I'm using MobileDevice.framework in an OS X application and I've been able to get how charged the battery of an iOS device connected over USB is using the AMDeviceCopyValue(device, domain, key) function with the arguments "com.apple.mobile.battery" for the domain and "BatteryCurrentCapacity" for the key.

I want to also get the number of Charge Cycles on the battery. I believe it's possible because iBackupBot is able to fetch that data. Does anyone know how it does this? I downloaded the free copy of the program and tested it on an iPhone 3GS, iPhone 4S, and an iPhone 5. It was able to grab the data for all three devices.

I have run iBackupBot through LLDB and logged its every usage of AMDeviceCopyValue(). In doing so, I determined that it isn't getting the Charge Cycles count from that.

Answer

indragie picture indragie · Dec 17, 2013

You can grab CycleCount and a bunch of other information using an ioreg (IORegistry) dump of the device. For example, see here for an IORegistry dump of the iPhone 5S. Note this section:

 +-o AppleD2045PMUPowerSource  <class AppleD2045PMUPowerSource, busy 0, retain count 10>
    | |   |   |   |   {
    | |   |   |   |     "battery-data" = {
                            .....
                            "CycleCount" = 1
        | |   |   |   |     "ChargerConfiguration" = 960
        | |   |   |   |     "DesignCapacity" = 1550
        | |   |   |   |     "BatteryData" = {"BatterySerialNumber"="C0133237ALXFHCWBP","ChemID"=4484,"Flags"=256,"QmaxCell0"=1619,"Voltage"=4051,"CycleCount"=1,"StateOfCharge"=72,"DesignCapacity"=1550,"FullAvailableCapacity"=1573,"MaxCapacity"=1517,"MfgData"=<4330313333323337414c58464843574250000000000000010000010000000100>,"ManufactureDate"="1332"}
        | |   |   |   |     "AtCriticalLevel" = No

The private IOKit.framework on iOS has an API for accessing all of this information (you can look at the dump to figure out the property names, etc. in order to be able to access it programatically). Erica Sadun has some open source code that uses private IOKit functions to access some device hardware information (without a jailbreak, IIRC) so maybe that will be helpful.

As for grabbing this info from a Mac, no idea. If you have an on device app that can pull the information from the IORegistry and send it to the Mac over USB that would work. If you wanted to do it without having any additional software installed on the device, you would have to figure out a way to remotely get an ioreg dump.

Hope this gets you somewhere!