iOS8下如何获取每个app的电池用量

iOS8下设置里面有个新功能可以统计每个app的电池用量,我现在想在我自己的app中获取这些功能。github上有个叫BatteryUsageEnhancer可以显示电池用量详细信息,我看了它里面关于的头文件里面关于BatteryUIController的头文件,里面有个appEnergyValue的方法可以取到每个电池用量的百分比,有个currentDictionary的属性存着每个app电池用量的详细信息,但是如果我要取这些信息必须得先把preferences起起来,然后再一层层把电池用量点开才能取到这些东西,有没有什么办法可以直接取到这些信息的,或者直接是从某个本地文件得到每个app的用电量信息,希望大神给个方向

BatteryUsageUI从名字来看就只是UI,很明显;它上面显示的数据应该是来自底层;在IDA里查看[BatteryUIController appEnergyValue:],发现电池数据来自这个方法的参数,可能是个PSSpecifier(需要用LLDB动态调试确认一下):
同时发现关键词“PLBatteryUIAppEnergyValueKey”,从前缀可知它不是来自于BatteryUsageUI。grep一遍系统,在/System/Library/PrivateFrameworks/PowerlogLiteOperators.framework/PowerlogLiteOperators里发现它的踪影,到同目录文件夹下看看,有好几个可疑framework:

电池数据很可能是用这些framework里的API读取的,需要进一步逆向。

另:关于这种以PreferenceBundle上的数据为线索,查找其数据源的方法,会在书的第二版中以实例详解,到时候你要仔细看看

谢谢大神,那个开源项目给的头文件包里面还有好几个PLBatteryUI打头的头文件,我再试试看看能不能取到

名字里含有UI的class和framework,数据源肯定来自另外的地方,要用IDA找

那我要好好再看看书上IDA那块了,之前我一直都是直接拿着别人调出来的头文件用的,如果我找到方法了再来结帖,谢谢

有权限的话是可以读的

那也得有地方读才行吧

他现在还不知道怎么读呢

我逆向过,在在私有库PowerLog.framework中 有一个这样的函数
NSMutableDictionary* PLBatteryUsageUIQuery(NSString* key,NSMutableDictionary* dict);
可以返回电池用量这个页面里的数据的具体的值。调用方法如下:
void* handle = dlopen("/System/Library/PrivateFrameworks/PowerLog.framework/PowerLog", RTLD_LAZY);
NSMutableDictionary* (PLBatteryUsageUIQuery)(NSString key,NSMutableDictionary* dict) =
dlsym(handle, “PLBatteryUsageUIQuery”);
if (PLBatteryUsageUIQuery) {
NSString* key = @“PLBatteryUIQueryFunctionKey”;
NSMutableDictionary input = [NSMutableDictionary dictionary];
NSNumber
myNumber = [NSNumber numberWithUnsignedInt:0];
[input setObject:myNumber forKey:key];
NSMutableDictionary *output = PLBatteryUsageUIQuery(key,input);
}
if(handle)
{
dlclose(handle);
}
output会包含你想要的信息哦

万分感谢,可以用,前几天工作比较忙没上论坛,IDE又分析不出ios8下面的二进制文件,所以这事就放了放,今天进来就看见有惊喜,再次感谢~

我也试过了!可以获取到很多惊喜,!但是我不知道获取的信息哪些是电量的,或者我获取的电量是什么单位{
Airdrop = 0;
Airplay = 0;
BBCondition = 0;
BLDEnergyAudio = 0;
BLDEnergyBGCPU = 0;
BLDEnergyBGLocation = 0;
BLDEnergyBluetooth = 0;
BLDEnergyCellData = “2.678370937652911”;
BLDEnergyDisplay = “4.665206214286261”;
BLDEnergyFGCPU = 0;
BLDEnergyFGLocation = 0;
BLDEnergyVoice = “0.1235205380704542”;
BLDEnergyWiFi = 0;
BLMEnergy = “7.497074498577”;
BLMEnergyAudio = 0;
BLMEnergyGPS = 0;
PLBatteryUIAppBundleIDKey = “com.tencent.mqq”;
PLBatteryUIAppEnergyValueKey = 0;
PLBatteryUIAppQualifiersKey = (
);
PLBatteryUIAppTypeKey = 0;
background = “1.352841044712968e-06”;
}

上面提到的方法iOS9已经被封掉了,悲剧