由于项目需要,要求获取iOS手机电池电量的详细值以及变化量等信息。所以做了相关的技术调研,实现的方法有很多。所以写了这篇总结,对于当前获取电池电量的方式进行一个整理。

方法一:通过苹果给的api获取

最简单的方式

UIDevice currentDevice].batteryMonitoringEnabled = YES;

double deviceLevel = [UIDevice currentDevice].batteryLevel;

另外一种写法

[UIDevice currentDevice].batteryMonitoringEnabled = YES;

[[NSNotificationCenter defaultCenter]addObserverForName:UIDeviceBatteryLevelDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification*notification) {

NSLog(@"电池电量:%.2f", [UIDevice currentDevice].batteryLevel);

}];

测试多次会出现偏差1%左右,也就是说, 这个办法是存在缺陷的, 最起码, 它不精确。

方法二:通过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;

}

方法三:找到Mac下IOKit.framework,将IOKit.framework里面的IOPowerSources.h和IOPSKeys.h拷贝到你的iOS项目中。另外, 还需要把IOKit也导入到你的工程中去,此方法也会出现偏差,不精确。

-(double)getCurrentBatteryLevel

{

//Returns a blob of Power Source information in an opaque CFTypeRef.

CFTypeRef blob = IOPSCopyPowerSourcesInfo();

//Returns a CFArray of Power Source handles, each of type CFTypeRef.

CFArrayRef sources = IOPSCopyPowerSourcesList(blob);

CFDictionaryRef pSource = NULL;

const void *psValue;

//Returns the number of values currently in an array.

int numOfSources = CFArrayGetCount(sources);

//Error in CFArrayGetCount

if (numOfSources == 0)

{

NSLog(@"Error in CFArrayGetCount");

return -1.0f;

}

//Calculating the remaining energy

for (int i = 0 ; i < numOfSources ; i++)

{

//Returns a CFDictionary with readable information about the specific power source.

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 percent;

psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));

CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);

psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));

CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);

percent = ((double)curCapacity/(double)maxCapacity * 100.0f);

return percent;

}

return -1.0f;

}

上面的方法都只能获取到电池电量所占百分比,不能获取到实际的电池电量毫安时。

ios 获取电量百分比_iOS 获取电池电量相关推荐

  1. ios 获取电量百分比_获取iOS设备信息(内存/电量/容量/型号/IP地址/当前WIFI名称)...

    最近工作上需要获取设备的一些信息,整理了一下,方便大家. 1.获取电池电量(一般用百分数表示,大家自行处理就好)-(CGFloat)getBatteryQuantity { return [[UIDe ...

  2. ios 获取电量百分比_ios13怎么设置电量百分比-互盾苹果恢复精灵

    很多用户在用iphone手机的时候都会出现很多不知道的问题,比如更新系统之后的新功能,才开始用iphone不知道如何操作,那么在ios13怎么设置电量百分比呢?如果显示你的实时电量情况呢?下面就为大家 ...

  3. 【LM】电池电量水平低 保留电池电量 关键级别电池电量水平

    win7电池设置里如下三个选项的含义 1.电池电量水平低 第1次提醒: a.系统会有个1次提示声音 b.电池图标会有个黄色感叹号 能做的设置: a.不采取任何操作 b.关机.睡眠.休眠 2. 保留电池 ...

  4. mysql 获取农历年份_iOS 获取公历、农历日期的年月日

    iOS 获取公历.农历日期的年月日 介绍三种方法获取 Date (NSDate) 的年月日. 用 date 表示当前日期.测试日期为公历 2017 年 2 月 5 日,农历丁酉年,鸡年,正月初九. l ...

  5. android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)

    本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...

  6. ios 取设备语言_iOS 获取设备当前语言和地区

    级别:★☆☆☆☆ 标签:「AppleLanguages」「zh-Hans-CN」 作者: WYW 审校: QiShare团队 需求:前段时间项目做本地化,向服务端请求数据的时候,上行参数需要携带设备当 ...

  7. ios 取设备语言_iOS获取当前系统语言

    iOS获取当前系统语言 东东 • 2017 年 05 月 16 日 一.获取地区标识// 比如Loacl是en_Zh NSString *identifier = [[NSLocale current ...

  8. java获取iOS可写目录_ios 获取文件目录路径方法大全

    我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...

  9. ios开发 静音键设置_iOS获取设备静音键的开关状态 误差优化

    题记:检测苹果手机的物理静音按键的开关状态 最近业务上有个需求就是以静音键的状态来做一些逻辑显示,但是在iOS5以后,苹果就没有开放现成的api来获取静音键的状态.只要遇到这样的情况,基本都是&quo ...

最新文章

  1. python debug工具_常用的 Python 调试工具,Python开发必读-乾颐堂
  2. 极端原理_为极端而设计
  3. 好男人必看!女生的30条隐私……
  4. 在GIS中运用坐标系统
  5. 云计算:大数据时代的系统工程
  6. 数学类网站、代码(Matlab Python R)、编程站点
  7. freetextbox java_FreeTextBox使用详解 (版本3.1.1)
  8. java 解析p12_java读取*.p12证书的信息
  9. Linux下发包工具sendip的使用
  10. 小程序中使用全局样式
  11. HDU 6319 Problem A. Ascending Rating (单调队列)
  12. cc攻击的原理和处理方式
  13. 海康球机时间同步配置
  14. cadence软件选择网络功能
  15. 适合开发人员看的鸿蒙OS介绍~
  16. Python批量修改txt文件的某列数值
  17. 三无电子烟与即将到来的监管时代
  18. java好学么_java是什么好学吗?难不难学?
  19. 友盟推送 php,PHP 友盟消息推送类
  20. 按键精灵调用python插件_【Python 教程】使用 Python 和大漠插件进行文字识别

热门文章

  1. Git 各指令的本质,真的是通俗易懂!
  2. mysql connector详解_MySQL Connector 编程
  3. linux下设置共享目录
  4. docker启动容器
  5. Django学习日志三:模型层
  6. Linux重启命令shutdown与reboot
  7. SpringBoot项目的两种打包方式分析
  8. VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping
  9. Apache+php安装整理
  10. Java总结 - 中间件