从开发者的角度分析iOS应如何省电
说明
网上关于iPhone如何省电的文章很多.但是基本没有讲原理.
而在生活中,很多人在使用iPhone中有着明显的错误的省电习惯.
本文从iOS开发者的角度,对iOS的各项功能和技术进行说明,得出合理的省电技巧,以供大家参考.
如果你对省电原理没有兴趣,请直接到文章最后,查看如何省电的方法.
哪些功能(硬件)是耗电大户
网络下载
wifi和4G都是耗电大户,但是要知道手机上的网络模块并不是一直在高速工作状态.一般认为下载时耗电多,如果不是处于下载状态,耗电较少. 同时网络下载时也会伴随磁盘操作,高速读写也较耗电. iOS系统对硬件优化较好,当app退到后台,屏幕熄灭后,网络模块几乎不耗电.
定位
iOS上的定位与安卓不同,综合包含:GPS,wifi辅助定位,蓝牙辅助定位.不能像安卓一样,单独关闭GPS,然后仍然可以用基站和wifi来粗略定位.
iOS系统会根据外部环境和app的定位请求精度,来综合使用多种定位手段.一般来说,打开wifi和蓝牙,可以有效加速定位,从而达到省电的目的.
定位精度对耗电影响极大:app可以指定定位的精度,从几公里到几十米,还有专门为导航准备的最高精度.随着app指定精度的提高,系统返回给app的位置精度和频率都会提高,耗电也会大幅增加.
拍照录像
拍照录像需要用到:相机捕捉画面+CPU/GPU处理数据+屏幕显示画面+磁盘读写,因此是很耗电的操作.尤其是当前新系统提供高清/高速视频录制功能,更是耗电大户.
更需要注意的是,现在很多美颜相机优化不好,大量特效的图像处理任务放在CPU执行,耗电严重.
视频播放
和拍照录像相比,视频播放用到的硬件也不少,尤其是在线观看视频时:网络下载+CPU/GPU处理数据+屏幕显示画面+磁盘读写,也比较耗电.
现在视频播放方面技术较为成熟,大部分情况下app可以直接使用iOS自带的视频框架,即便使用开源组件自定义播放器,大部分也可以使用GPU加速解码播放. 如果发现某个播放器在播放时发热严重,可能是因为使用了CPU编解码,建议更换其他软件.
屏幕高亮
在强光下使用手机,屏幕会自动变亮, 除此之外,在拍照录像和展示二维码时,也会有屏幕高亮情况,耗电会有所增加.
复杂动画
有些复杂动画,可能会有大量的计算,有些可能会截屏并获取截图上的内容,有些可能会绘制生成大量图像.如果不加优化,会比较耗电.
但是一般情况下,app中不会有过多的动画,也不会过于复杂,iOS上对于大部分常见动画支持很好,耗电极少.
蓝牙
蓝牙可以大概分为:传统蓝牙和低功耗蓝牙(BLE).
蓝牙音箱,蓝牙耳机,蓝牙助听器等用的是传统蓝牙,耗电相对较多;而手环,手表等使用的是低功耗蓝牙,耗电量极少.
怎么判断呢?因为iOS上,传统蓝牙是不允许开发者操作的,使用蓝牙音箱时,我们只需要进入系统设置界面--搜索连接就可以使用了;而那些使用app来配对连接并可以用app控制的,就是BLE,开发者可以使用CoreBluetooth框架来控制低功耗蓝牙的.
一般来说,不管是传统蓝牙,还是低功耗蓝牙,相比其它硬件来说耗电并不大,尤其是低功耗蓝牙,可以认为几乎不耗电.
AR/3D游戏
AR和3D涉及大量计算和图形显示任务,而且还很有可能需要网络支持,时刻保持连接,还有磁盘读写,耗电量极大.
苹果对此的规定和限制
iOS11开始,在上拉界面的快捷菜单中关闭蓝牙和wifi时,并不是真正的关闭,只是断开了连接而已,并且会在次日早上6点自动打开.而苹果自家的apple watch和iPad配套的笔并不会断开连接,AirDrop(隔空投送)也可以继续使用.基于蓝牙和wifi的辅助定位也可以使用.
如果想真正关闭,要进入设置中,关闭蓝牙和wifi,才是真正的关闭,芯片断电,系统蓝牙和wifi缓存清理.
苹果之所以这样设计,正是因为对系统掌握能力强,优化到位.因此推荐大家,平时不要关闭蓝牙和wifi,根本省不了多少电,反而在定位时增加了耗电.
前台机制
按照苹果的要求,一个app在完成相应操作后,应该及时释放或停止对硬件或系统功能的控制.比如,一个app(比如:饿了么)需要根据不同城市显示不同首页内容,那么应该在获取到手机的当前城市后,主动停止定位.
同时,苹果还建议:
- 如果一项操作不确定什么时候需要,则尽量考虑延后执行或者省去;
- 能使用单次定位,就不要使用
持续定位
(极其耗电).拿到满足要求的数据后立即停止; - 尽量避免使用定时器不断更新数据,而要在用户操作时或前后台切换时再刷新数据;如果必须要使用定时器,尽量使用长间隔,并设定暂停条件;
- 多使用缓存机制,出错时重试次数应设置限制;
后台机制
iOS系统的后台共有三种:
- Background Tasks(后台任务):APP 在前台时启动某项任务,然后在未结束之前突然切换到了后台,那么 APP 可以在切换回调里使用某些 API 来继续向系统请求一些时间来继续完成这个任务;完成之后通知系统,之后系统会将 APP 挂起;
- Downloading(下载):在后台启动从网络下载文件的任务 – 对于文件下载,iOS 有专门的机制;
- Specific Backgournd Tasks(特殊后台任务):应用需要在后台一直执行代码,长时间运行;
先说第一种后台任务,其实就是一个app刚退到后台时,可以向系统申请一段时间(一般几十秒)来处理一些任务,等任务处理完成再被系统挂起.比如一个地图软件,下载离线地图后,正在安装,用户此时按了Home键,那就可以向系统申请一段时间等安装完成后,再挂起.如果耗时超过系统限制,会被强制清理.
第二种后台下载,必须使用 iOS 指定的机制才可以,那就是 NSURLSession来创建后台下载.即使你的app已经进入后台,或被系统杀掉了,当下载完成时,系统会唤醒app来处理下载好的文件.很多杂志类应用会有这种功能.
第三种特殊后台情况就比较多了:
需要在后台播放音频 – 如音乐播放;会一直运行
需要在后台录音;会一直运行
在后台时也需要不断通知用户位置变动的; 比如导航app会一直后台运行, 但地理围栏app只会在进入和退出指定位置时唤醒app;
支持 VoIP 电话的 – 如 skype 网络电话;会在有电话时被系统唤醒
需要在后台有规律的下载和处理网络内容的;会在指定时间或网络条件下被系统唤醒
在后台有规律的从其他外设(第三方配件)获取并更新数据的;会在收到配件消息时被系统唤醒
后台唤醒注意事项
还需要注意的是,那些被系统后台唤醒的app并不是无限制的,大部分情况下被唤醒后只有10秒时间来处理任务,超时未完成处理会被系统强制挂起.
iOS为了控制后台任务,使用了AI技术,依靠人工智能来判断一个app应不应该被唤醒,唤醒频率是多少.已经不是你的app想要唤醒就能唤醒的了,如果手机电量不足或者被唤醒后你的app没有联网存取一些数据,或者总是超时被强制结束,那就不会再被唤醒.
还需要注意的是, 绝大多数情况下,系统不会重启被用户手动强制关闭的 APP,但在 iOS 8 之后, location apps (地理围栏等)是个例外。其他的所有被用户手动强制关闭的APP 都不会被系统主动唤起,直到用户再次主动启动这个 APP,或者手机重启并在用户输入了解锁密码之后才会恢复机制。
上架审核
苹果对后台功能要求很严格,要求开发能不用后台就不要用.
如果一定要用后台功能,需要给出说明和解释,让审核人员清楚地知道,app的哪个功能用到了后台模式.尤其是后台定位功能,因为涉及用户隐私,审核非常严格.
常用软件是怎么做的
绝大部分软件是遵守苹果开发规范的,但是还是有一些app由于设计不良或出现bug,导致耗电量很大:
- 常见的是在进入后台时,或在前台但屏幕熄灭时,未能及时停止某些耗电操作(比如下载和定位),导致耗电.
- app为了追求动态化使用了大量web技术,也会导致耗电增大.比如淘宝app,就有明显的运行卡顿,耗电过多的情况.
- 后台存取(后台应用刷新)过于频繁,耗电增大.
比如在系统设置界面,可以看到微信有个后台应用刷新开关,如果打开这个开关,那么微信在收到新消息推送后,在后台就可以更新消息,直接打开微信就能看到了;如果关闭这个开关,收到新消息后,可以在推送栏看到消息,但打开微信后还需要联网重新下载完整消息.
另外还有一些软件,故意钻空子,利用技术手段作弊,强行运行在后台,达到某些目的.尤其在iOS10之前的系统上很常见.
后台作弊
- 由于iOS后台机制的限制,以前要想在后台运行,可以申请后台权限后,模仿音乐播放器,在后台循环播放一段无声的音乐,这样就可以一直运行在后台,直到内存不足被系统杀死.
- 利用后台存取(后台应用刷新)功能,正常情况下,声明了这个类型之后,系统在你的 APP 进入后台后,间隔性的给机会将你的 APP 唤醒,唤醒后再通过
beginBackgroundTaskWithExpirationHandler:
向系统申请一段时间,然后再重复申请一段时间,就可以长时间在后台运行.而且被杀死后还有可能被系统重新唤醒.
但是,现在iOS10和iOS11之后,这些方法也很难骗过审核人员和iOS系统的后台唤醒机制了.
普通用户该怎么省电
前面讲了很多,都是作为开发者在长期开发中总结的经验,还有阅读苹果相关文档得到的知识.
但对于普通用户来说,到底该怎么省电呢? 我根据上面的原理,结合自己使用iOS系统的经验,总结了下面几条:
经常查看耗电情况
在手机的设置—电池,页面中,可以看到过去24小时和过去7天的电池消耗情况,点击右侧的时钟按钮,还可以更详细的显示各个app的前台运行时间和后台运行时间.
对于某些后台运行时间明显异常的应用,应该尝试关闭权限或直接杀死,以避免在后台长时间运行耗电.
比如我就遇到过,某个手环app在一次更新后,定位功能未及时关闭,一直在后台运行并不断定位,一晚上耗电70%.通过改变定位权限来限制后台耗电.
关闭不必要权限
这里的权限主要指三个:一个是定位权限,能只给使用时定位权限
,就尽量不给始终定位权限
,当然,对于导航应用来说,如果不给始终定位
权限的话,就无法在后台语音导航了;
另一个是后台应用刷新
,这个权限不会提示,需要自己在应用安装后手动关闭.对于微信之类的常用app可以保留,不常用的建议关闭.关闭这个权限并不影响收取通知.
还有一个是通知
的权限,有通知就会反复唤醒手机,当app同时有后台应用刷新
权限时,还有可能被通知唤醒,在后台启动.
降低屏幕亮度
适当降低屏幕亮度可以省电,这个似乎没有什么需要解释的.
禁用抬起唤醒等系统功能
还是在设置—电池,页面中,可以禁用这个功能,这样手机就不会因为随便翻动手机而亮屏了,需要点亮屏幕时可以手动按Home键点亮.但对于iPhoneX就不适用了.还可以缩短屏幕锁定的时间,比如改为30秒.
还可以根据自己的需要,禁用系统更新,iCloud同步,siri唤醒等.
但如果你不想永久禁用这些功能,只想在外出旅途中尽可能节省电量,那可以启用低电量模式.
启用低电量模式
iPhone默认在电量只有20%时进入低电量模式,但是我们也可以手动进入低电量模式来延长续航.
进入低电量模式后:
屏幕锁定时间强制改为30秒;
屏幕亮度稍微降低;
应用后台唤醒频率大大降低;
网络和蓝牙模块扫瞄频率,连接速度等都会降低;
CPU运行频率降低;
系统动画效果减弱;
定位频率降低;
自动禁用软件更新和iCloud同步;
禁用siri语音唤醒...
一套组合拳下来,省电效果十分突出.适用于突然需要外出一整天,却没有带充电宝的情况.
慎重使用杀进程
前面说到,手动杀死进程后,一般情况下系统不会再唤醒了,所以杀死一些应用可以省电.
但是有些应用是需要经常启动的,比如微信,一天可能需要看上百次,如果反复杀死上百次,再反复重新启动上百次,耗电只会更多.
慎重关闭蓝牙和wifi
正常情况下,在待机时,蓝牙和wifi耗电极少,但在定位时却可以有效加速定位.极端情况下需要省电,也应该使用低电量模式,这样省电最明显.除非确定自己不需要蓝牙和wifi功能,也不需要使用定位功能(也没有应用在后台定位或使用地理围栏),那么再考虑关闭.
总结
在明白了iOS系统的前台后台原理后,我们就可以知道,在平时生活中,我们只需要经常查看耗电情况
和关闭不必要权限
这两招,就可以很好的控制iOS的耗电情况.
必要时再加上启用低电量模式
,并尽可能少使用那些重度依赖网络,定位,相机,视频功能的app就可以了.
如果还不能满足你的要求,只能随身带充电宝或者等以后苹果更新大容量电池的iPhone了.
来自 掘金 作者 :史前图腾 源链接:https://juejin.im/post/5afd82f15188254270642ff0