Получение уровня заряда батареи 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< /а>


person Kristina Brooks    schedule 18.07.2010    source источник
comment
Почему нельзя использовать UIKit?   -  person shosti    schedule 18.07.2010
comment
Потому что мое приложение не связано с UIKit, потому что оно не нужно?   -  person Kristina Brooks    schedule 19.07.2010
comment
Похоже, вам это нужно.   -  person kirk.burleson    schedule 19.07.2010
comment
На самом деле, я как бы спрашивал, как узнать уровень заряда батареи с помощью IOKit, а не просто заставлял людей говорить мне, что мне нужен UIKit.   -  person Kristina Brooks    schedule 19.07.2010


Ответы (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 может сказать вам, что вы ищете, прежде чем вы начнете программировать.

person drawnonward    schedule 18.07.2010
comment
UIKit использует IOPMPowerSource. Я не знаю, что с этим делать, кроме IOServiceMatching. :( - person Kristina Brooks; 19.07.2010
comment
Какие заголовочные файлы необходимы для приведенного выше фрагмента? Спасибо! - person TooTallNate; 26.04.2011

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

person shosti    schedule 18.07.2010

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

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

person Williham Totland    schedule 18.07.2010
comment
Хех, вы немного ошибаетесь в том, что не используете UIKit. UIKit предназначен для приложений AppStore, которые работают с SpringBoard. Мое приложение работает вместо SpringBoard. Короче говоря, UIKit использует SpringBoard, который не работает. - person Kristina Brooks; 19.07.2010
comment
Итак, побег из тюрьмы и прочее? Удачи с этим. - person Williham Totland; 19.07.2010
comment
IOKit на iPhone не имеет общедоступного API. Общедоступный API для получения уровня заряда батареи — это, конечно же, -[UIDevice batteryLevel]. Я иду на риск и предполагаю, что вы выполняете какую-то работу по взлому, что нормально, но остается вопрос почему?. - person Jonathan Grynspan; 19.07.2010
comment
Ага, ты что-то имеешь против неофициальных вещей? - person Kristina Brooks; 19.07.2010
comment
Почему? Я делаю замену SpringBoard - person Kristina Brooks; 19.07.2010
comment
Дело не в том, что люди имеют что-то против этого, просто большинство разработчиков здесь знают, как делать вещи официальным способом. Возможно, вам больше повезет, если вы спросите на веб-сайте с большим количеством «джейлбрейк-разработчиков». - person Tom Irving; 19.07.2010
comment
Вы пробовали использовать UIKit без SpringBoard? Вы уверены, что для этого требуется, чтобы этот процесс был запущен? - person Jonathan Grynspan; 19.07.2010
comment
Джонатан Гринспан, вы правы. UIKit также огромен, и это бессмысленно, если вы используете его для одного API. - person Kristina Brooks; 19.07.2010
comment
Так что используйте его и для других API. Нет смысла искать десяток обходных путей, если в UIKit есть все прямые маршруты. - person Jonathan Grynspan; 19.07.2010
comment
Огромный? Это несколько килобайт, и он линкуется динамически… - person ; 31.10.2010