Получение уровня заряда батареи iPhone

У меня простой вопрос. Как мне узнать уровень заряда батареи iPhone?

[UIDevice currentDevice] batteryLevel]

Достаточно просто? Однако есть небольшой улов - я не могу использовать UIKit. Вот что я написал до сих пор, но я не думаю, что это работает:

    // notification port
IONotificationPortRef nport = IONotificationPortCreate(kIOMasterPortDefault);

CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(nport), kCFRunLoopDefaultMode);

CFMutableDictionaryRef matching = IOServiceMatching("IOPMPowerSource");

kern_return_t kr = IOServiceAddMatchingNotification(nport, kIOFirstMatchNotification, matching, (IOServiceMatchingCallback)power, self, &powerIterator);

NSLog(@"Kernel said %d",kr);

power((void*)nport,powerIterator);

Я все еще уверен, что вам нужно положиться на IOKit, чтобы восстановить уровень заряда батареи. Мое приложение не использует UIKit, так как это низкоуровневое приложение, в котором UIKit не может использоваться. Вот рамки, которые я использую:

http://img837.imageshack.us/img837/1829/screenshot20100718at211.png

3 ответа

Решение

Некоторое время назад я написал программу под названием iox, которая похожа на ioreg, за исключением того, что мне легче переводить вызовы IOKit. Когда я запускаю это на своем ноутбуке, я вижу следующее с уровнем заряда батареи.

AppleSmartBattery - IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController/AppleSmartBatteryManager/AppleSmartBattery
        CurrentCapacity = 11678
        FullyCharged = YES
        DesignCapacity = 13000
        MaxCapacity = 11910
        ...

В коде это

IOServiceNameMatching( "AppleSmartBattery" );

Я понятия не имею, будет ли имя одинаковым на iOS, но я бы попробовал либо найти программу, подобную ioreg, которую можно запустить на iPhone, либо написать что-нибудь простое, чтобы записать эквивалент.

ioreg является частью IOKitTools и должен компилироваться на iPhone.

Редактировать:

CFMutableDictionaryRef matching , properties = NULL;
io_registry_entry_t entry = 0;
matching = IOServiceMatching( "IOPMPowerSource" );
//matching = IOServiceNameMatching( "AppleSmartBattery" );
entry = IOServiceGetMatchingService( kIOMasterPortDefault , matching );
IORegistryEntryCreateCFProperties( entry , &properties , NULL , 0 );
NSLog( @"%@" , properties );
CFRelease( properties );
IOObjectRelease( entry );

Добавьте некоторые проверки безопасности. Как только вы выясните, какие свойства вам нужны, вы можете получить их напрямую, вместо того чтобы использовать IORegistryEntryCreateCFProperties, чтобы получить их все сразу.

IOKit представляет все как большое дерево. IOPMPowerSource может не иметь необходимых атрибутов напрямую, и в этом случае вам нужно будет перебирать дочерние элементы. Использование чего-то вроде ioreg может сказать вам, что вы ищете, прежде чем начать кодирование.

У меня нет опыта разработки джейлбрейков, но это руководство может оказаться полезным.

Я собираюсь пойти на большой: почему?

Как вы, наверное, знаете, вы не можете не использовать UIKit на iPhone, поэтому я не совсем уверен, о чем вы.

Другие вопросы по тегам