ios获取电量的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- (double)getCurrentBatteryLevel {
UIApplication *app = [UIApplication sharedApplication];
if (app.applicationState == UIApplicationStateActive || app.applicationState == UIApplicationStateInactive) {
id statusBar;

if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
statusBar = (UIView *)[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"];
NSDictionary *items = [statusBar valueForKeyPath:@"_items"];

if (items && [items isKindOfClass:[NSDictionary class]]) {
for (id item in [items allValues]) {
NSLog(@"%@", NSStringFromClass([item class]));
if ([NSStringFromClass([item class]) caseInsensitiveCompare:@"_UIStatusBarBatteryItem"] == NSOrderedSame) {
UIView *batteryView = [item valueForKeyPath:@"_batteryView"];
double batteryLevel = [[batteryView valueForKeyPath:@"_chargePercent"] doubleValue];
if (batteryLevel > 0 && batteryLevel <= 1) {
return batteryLevel;
}
}
}
}
} else {
statusBar = (UIView *)[app valueForKeyPath:@"_statusBar"];
for (id aview in [statusBar subviews]) {
int batteryLevel = 0;
for (id bview in [aview subviews]) {
if ([NSStringFromClass([bview class]) caseInsensitiveCompare:@"UIStatusBarBatteryItemView"] == NSOrderedSame) {
Ivar ivar = class_getInstanceVariable([bview class],"_capacity");
if (ivar) {
batteryLevel = ((int (*)(id, Ivar))object_getIvar)(bview, ivar);
if (batteryLevel > 0 && batteryLevel <= 100) {
return batteryLevel / 100.0;
}
}
}
}
}
}
}
return 0;
}