最近在测试App的时候,发现手机特别容易发烫,咱们都知道 ,若是手机容易发烫,那么耗电量确定会至关大,手机电量使用的时间也会相对少;对此,我在工做之余抽了点时间,对手机的耗电量进行了一些研究,但愿能够给你们起到抛砖引玉的做用,对本身的App进行相应的优化,(在咱们的能力范围内 ,系统问题咱们暂时没还得靠苹果大佬那边进行优化)让咱们的手机电量的使用时间更长些。html
为了更好的去优化手机的耗电量 ,我查看了苹果官方文档相关的资料,分别主要须要了解的有如下几点: Apple文档:
算法
入口: UIKit — App Structure (Core APP) — Device Environment (UIDevice) — Getting the Device Battery State 到这里 ,咱们就能够看到 耗电量有几个个重要属性batteryState
The battery state for the device.缓存
@property(nonatomic, readonly) float batteryLevel; 电池电量范围从0.0(彻底放电)到1.0(100%充电)。在访问此属性以前,请确保已启用电池监视。性能优化
若是未启用电池监控,则电池状态为且此属性的值为-1.0。UIDeviceBatteryStateUnknown
bash
耗电量的状态服务器
UIDeviceBatteryState
设备的电池电量状态。网络
UIDeviceBatteryState
设备的电池电量状态。app
UIDeviceBatteryState
设备的电池电量状态。ide
UIDeviceBatteryState
设备的电池电量状态。分别有以下几种:UIDeviceBatteryStateUnknown
没法肯定设备的电池状态。函数
UIDeviceBatteryStateUnplugged
设备未插入电源; 电池正在放电。
UIDeviceBatteryStateCharging
设备已接通电源,电池电量低于100%。
UIDeviceBatteryStateFull
设备已接通电源,电池100%充电。
经过这张图,咱们大概能够了解 ,咱们的手机的耗电量,主要的状态:
(1)首页咱们针对CPU和能耗的关系:CPU使用量越大,功率越大,电能消耗越多,电池消耗也就越快。功率大小因为设备、处理器、其余硬件资源等会有所不一样,表1基于闲置状态(idle state),给出了不一样CPU使用量的一个大体的对比。
你的app能够经过分批执行、下降执行频率来避免产生零散的任务。例如,不采用同一个线程串行执行一系列任务,而是把任务同时放到多个线程,如图所示。每次使用CPU,内存、缓存、总线等都得通电。经过分批执行,使用时间也更短。由于给定时间内作了更多的工做,须要更多能量,这种策略会致使更大的前期动态功耗。做为交换,固定能耗减少了,随着时间推移,这会极大地节省电能。你的app提升了功率,但它更高效,用了更少的时间。这使得CPU回到闲置状态,其余元件也更快地断电
GCD里的dispatch queues、dispatch semaphores等同步工具比定时器效率高不少,尽可能不要用定时器作同步工具。全部须要指定一个最后期限的函数或方法都属于定时器,好比: a. 高级定时器包括dispatch timer sources、CFRunLoopTimerCreate和其余CFRunLoopTimer函数、NSTimer、performSelector:withObject:afterDelay:方法。 b. 底层定时器包括sleep, usleep, nanosleep, pthread_cond_timedwait, select, poll, kevent, dispatch_after, dispatch_semaphore_wait。 若是必定要用定时器,尽可能高效地使用,能够参照下列指导方针:
iOS9以后,iPhone增长了低电量模式,用户若是但愿延长iPhone电池的寿命,能够在设置 > 电池中开启该功能。开启该功能以后iOS会采起一些措施,好比:
若是你的app只是须要快速肯定一下用户的位置,最好用CLLocationManager的requestLocation (iOS9引入)方法。定位完成以后会自动让硬件断电。 除了导航,大多数app不须要一直实时更新位置。须要位置服务时开启一下定位,尽可能多隔一些时间再进行下次位置更新,更新完了以后立刻关掉定位。除非用户在移动的交通工具里,不然不频繁地更新位置通常没多大问题。下降定位精度。iOS设备默认采用最高精度定位,若是你的app不是确实须要米级的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)。通常来讲Core Location提供的精度比你设置的要好,好比你设置为3千米左右的精度,可能会收到100米左右的精度信息。 若是定位精度一直达不到设置的精度时,中止更新位置,稍后再试。 须要后台更新位置时,尽可能把pausesLocationUpdatesAutomatically设为YES,若是用户不太可能移动的时候系统会自动暂停位置更新。
static NSDateFormatter *cachedDateFormatter = nil;
+ (NSDateFormatter *)cachedDateFormatter {
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @“YYYY-MM-dd HH:mm:ss”];
}
return dateFormatter;
}
复制代码
1.Timer的时间间隔不宜过短,知足需求便可 2.线程适量,不宜过多,不要阻塞主线程 3.优化算法,减小循环次数 4.定位和蓝牙按需取用,定位以后要关闭或下降定位频率
因为直接数据采集会出现较大偏差,建议使用如下方法进行数据采集: 1.在设备上进入设置 > 2. 开发者 > 3. Logging > 4. Enery打开 > 5. Networking打开> 6.点击 Start Recording > 7. 而后点开咱们想要测试的App,进行测试,定好时间,> 8.时间到了后点击 中止 Stop Recording > 9.在Instruments中选择好设备,进入Energy Log > 10.选择File > Import Logged Data from Device
参考文章: 内存泄漏对耗电量的影响
教你开发省电
耗电量基础概念