通过runtime 获取StatusBar上电池电量控件类私有变量的值,此方法可精准获取iOS6以上电池电量
- (int)getCurrentBatteryLevel{
UIApplication * app = [UIApplication sharedApplication];
if (app.applicationState == UIApplicationStateActive || app.applicationState == UIApplicationStateInactive) {
Ivar ivar = class_getInstanceVariable([app class], "_statusBar");
id status = object_getIvar(app, ivar);
for (id aview in [status subviews]) {
int batteryLevel = 0;
for (id bview in [aview subviews]) {
if ([NSStringFromClass([bview class]) caseInsensitiveCompare:@"UIStatusBarBatteryItemView"] == NSOrderedSame && [[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
Ivar ivar = class_getInstanceVariable([bview class], "_capacity");
if (ivar) {
batteryLevel = ((int (*)(id,Ivar)) object_getIvar)(bview, ivar);
//这种方式也可以
/*ptrdiff_t offset = ivar_getOffset(ivar);
unsigned char *stuffBytes = (unsigned char *)(__bridge void *)bview;
batteryLevel = * ((int *)(stuffBytes + offset));*/
NSLog(@"电池电量为:%d",batteryLevel);
if (batteryLevel > 0 && batteryLevel <= 100) {
return batteryLevel;
}else{
return 0;
}
}
}
}
}
}
return 0;
}