Получение уровня заряда батареи iPhone - PullRequest
4 голосов
/ 18 июля 2010

У меня простой вопрос.Как узнать уровень заряда батареи 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 ]

8 голосов
/ 19 июля 2010

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

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

В коде, то есть

IOServiceNameMatching( "AppleSmartBattery" );

Я понятия не имею, будет ли имято же самое на iOS, но я бы попробовал либо найти такую ​​программу, как ioreg, которую можно запустить на iPhone, либо написать что-то простое, чтобы записать эквивалент.следует просто скомпилировать на 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 может сказать вам, что вы ищете, прежде чем вы начнете кодировать.

2 голосов
/ 19 июля 2010

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

0 голосов
/ 18 июля 2010

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

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

...