4

我有一个简单的问题。如何获取 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

4

3 回答 3

8

前段时间我写了一个名为iox 的程序,它类似于ioreg,除了它使我更容易转换回IOKit 调用。当我在笔记本电脑上运行它时,我看到以下电池电量。

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

在代码中,即

IOServiceNameMatching( "AppleSmartBattery" );

我不知道 iOS 上的名称是否相同,但我会尝试找到一个可以在 iPhone 上运行的程序,例如 ioreg,或者编写一些简单的东西来记录等价物。

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 之类的东西可以在开始编码之前告诉您要查找的内容。

于 2010-07-18T20:29:07.473 回答
2

我没有任何越狱开发经验,但本指南可能会有所帮助。

于 2010-07-18T20:54:09.573 回答
0

我要去找大的:为什么

正如您可能知道的那样,您真的不能在 iPhone 上不使用 UIKit,所以我不太确定您在说什么。

于 2010-07-18T19:58:07.867 回答