获得iPhone的电池电量

时间:2010-07-18 19:44:54

标签: iphone kernel battery iokit

我有一个简单的问题。我如何获得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的低级应用程序。以下是我使用的框架:

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

3 个答案:

答案 0 :(得分:8)

不久前我写了一个名为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这样的东西可以告诉你你在寻找什么。

答案 1 :(得分:2)

我对越狱开发没有任何经验,但this guide可能会有所帮助。

答案 2 :(得分:0)

我要去找一个大的:为什么

你可能知道,你不能在iPhone上使用UIKit,所以我不太清楚你在做什么。