当我们想解决iOS耗电问题时,首先要能获取到系统电量才能更好地去解决的问题。下面开始介绍。
在 iOS 中,IOKit framework 是专门用于跟硬件或内核服务通信的。所以,我们可以通过 IOKit framework 来获取硬件信息,进而获取到电量消耗信息。
第一步
导入 IOKit.framework,但是目前 IOKit.framework库只存在Mac下,所以要自己新建一个mac项目,然后从那个项目导入,再拷到iOS项目中
第二步
把IOKit.framework里面的IOPowerSources.h和IOPSKeys.h拷贝到你的iOS项目中。
第三步
把 batteryMonitoringEnabled 置为true
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
第四步
通过如下代码获取 1% 精确度的电量信息
#import "IOPSKeys.h"
#import "IOPowerSources.h"
-(double) getBatteryLevel{
// 返回电量信息
CFTypeRef blob = IOPSCopyPowerSourcesInfo();
// 返回电量句柄列表数据
CFArrayRef sources = IOPSCopyPowerSourcesList(blob);
CFDictionaryRef pSource = NULL;
const void *psValue;
// 返回数组大小
int numOfSources = CFArrayGetCount(sources);
// 计算大小出错处理
if (numOfSources == 0) {
NSLog(@"Error in CFArrayGetCount");
return -1.0f;
}
// 计算所剩电量
for (int i=0; i<numOfSources; i++) {
// 返回电源可读信息的字典
pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));
if (!pSource) {
NSLog(@"Error in IOPSGetPowerSourceDescription");
return -1.0f;
}
psValue = (CFStringRef) CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));
int curCapacity = 0;
int maxCapacity = 0;
double percentage;
psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));
CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));
CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
percentage = ((double) curCapacity / (double) maxCapacity * 100.0f);
NSLog(@"curCapacity : %d / maxCapacity: %d , percentage: %.1f ", curCapacity, maxCapacity, percentage);
return percentage;
}
return -1.0f;
}
网友评论