[UIDevice currentDevice].batteryMonitoringEnabled = YES;
double deviceLevel = [UIDevice currentDevice].batteryLevel;

获取当前剩余电量, 我们通常採用上述方法。

这也是苹果官方文档提供的。

它返回的是0.00-1.00之间的浮点值。

另外, -1.00表示模拟器。

貌似这种方法不错, 也非常easy。

可是细致观察它的返回值, 我们能够发现。 它是以0.05递变的。 折算成100% 也就是以5%来递变的。

也就是说, 这个办法是存在缺陷的, 最起码, 它不精确。

后来找到了一个方法。相当精确, 误差保持在1%以内。

我们知道, Mac下有个IOKit.framework库。

它能够计算出我们须要的电量。

假设我们要使用它的话, (iOS是不提供的) 能够先建立一个Mac下的project, 找到IOKit.framework。那IOKit.framework里面的IOPowerSources.hIOPSKeys.h复制到你的iOS项目中。

另外, 还须要把IOKit也导入到你的project中去。

(当然, 假设嫌麻烦, 能够直接到我的Github中去下载project, 导出须要的文件)

先给出我的Github下载链接:https://github.com/colin1994/batteryLevelTest.git

以下详细介绍下用法。

1。

导入须要的IOPowerSources.h, IOPSKeys.h 和 IOKit

2。

在实现的地方声明头文件

#import "IOPSKeys.h"
#import "IOPowerSources.h"

3。加入方法

/**
* Calculating the remaining energy
*
* @return Current batterylevel
*/
-(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;
}

4。调用方法

NSLog(@"%.2f", [self getCurrentBatteryLevel]);

iOS开发- 获取精确剩余电量的更多相关文章

  1. iOS 开发获取唯一标识

    在做流量精灵的时候有这样一个需求,帐户默认需要取手机的imsi 信息.这就有一个好处,即便用户删除我们的应用后从新下载,下次进入时他们还会以同样的身份登陆,并且获得原先纪录.这样不仅对于开发公司人员来 ...

  2. iOS开发-获取属性和方法

    iOS开发数据存储有两种方式,属性列表和对象编码,属性列表可以通过NSArray,NSMutableArray,NSMutableDictionary,存储对象我们可以通过归档和解档来完成.如果我们想 ...

  3. iOS开发 获取手机信息(UIDevice,NSBundle,NSlocale)

    在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位, ...

  4. ios开发-获取手机相关信息

    今天在做客户端的时候,里面有个意见反馈功能. 调用系统带的邮件功能,发送邮件到指定邮箱. 然后我就想,应该在邮件正文部分添加手机相关内容,比如型号,版本,应用程序的版本等等,这样不仅使用者方便,开发者 ...

  5. iOS开发-获取设备型号信息

    开发中有的时候查看设计统计数据,或者通过日志查看错误信息,这个时候我们就需要获取获取设备信息,看下关于设备有几种方法: NSLog(@"%@",[[UIDevice current ...

  6. iOS开发获取缓存文件的大小并清除缓存

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  7. iOS开发——获取当前屏幕显示的viewcontroller

    获取当前屏幕显示的viewcontroller,然后想怎么跳就怎么跳. - (UIViewController *)getCurrentVC { UIViewController *result = ...

  8. iOS开发——获取手机当前WiFi名和MAC地址

    获取手机WiFi信息. iOS9以前的方法,还是能用,警告就警告吧!iOS9以后使用的是苹果最新的API框架,NetworkExtension/NEHotspotHelper.h,这个框架,第一次开放 ...

  9. ios开发获取SIM卡信息

    .加入一个Framework(CoreTelephony.framework). .引入头文件 #import<CoreTelephony/CoreTelephonyDefines.h> ...

随机推荐

  1. 面试题:对一个正整数n,算得到1需要的最少操作次数

    实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...

  2. Oracle 表空间操作

    -- 查询已有表空间 SELECT TABLE_SPACENAME FROM DBA_TABLESPACES; -- 创建表空间 CREATE TABLESPACE SPACE DATAFILE ‘E ...

  3. Libev学习笔记4

    这一节首先分析Libev的定时器部分,然后分析signal部分. 对定时器的使用主要有两个函数: ev_timer_init (&timeout_watcher, timeout_cb, .) ...

  4. 关于java项目导入,所碰到的版本问题

    怎么修改myeclipse 项目中用的jdk版本 工具/原料 MyEclipse java项目 方法/步骤  首先打开MyEclipse,如下图所示  打开之后,找到我们的java项目  然后右键-- ...

  5. OpenCV配置使用版

    在VS2010环境中应用Opencv,网上找到了很多配置方法,但大多都是老版本的,很多新手面对最新版本的Opencv无从下手,就给新手童鞋写了这么一篇超级详细的配置攻略,贴上来共享.要强调一点的就是, ...

  6. js取一维数组最大值,最小值

    最近项目中遇到了,处理数组数据问题:     var newStrs=[1,2,3,4];               alert(Math.min.apply(null,newStrs));  // ...

  7. 问题解决: WordPress on SAE注册邮件无法发送

    方法一: 修改代码 Step 1: 改写wp-includes/pluggable.php, 把WordPress默认邮件设置改为SMTP模式. // Set to use PHP's mail() ...

  8. C++ Input & Output

    1.C++ I/O各类之间的继承关系图 参考网址: http://www.cplusplus.com/reference/iolibrary/ Note: 在程序中包含iostream文件将自动创建8 ...

  9. spring mvc实现ajax 分页

    使用到的技术: ·spring 3 mvc ·json ·jquery ·java ·mysql 首先,要了解如何在spring mvc中使用json. 以下主要从Dao和View及Controlle ...

  10. BZOJ 1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 &l ...