从开发者的角度分析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

2018 年 05 月 17 日 

从开发者的角度分析iOS应如何省电的更多相关文章

  1. 【转】从开发者的角度看待各移动平台 ios/android/wp7/win8ost title

    T_T 这伪技术博客都快给写成Tron的读书笔记专栏了,这样可不行欸~ 如今正是移动平台的战国时期,厌烦了去讨论移动平台的未来,也无意于在HTML5和Native App之间纠结.本文只从开发者纯技术 ...

  2. Android IOS WebRTC 音视频开发总结(六六)-- 三个角度分析美女视频直播这个行业

    本文主要从用户,公司和技术角度分析美女视频直播这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help 美女视频直播 ...

  3. 从不同的角度分析Flex的优缺点

    从不同的角度分析Flex的优缺点 技术角度: (1)具备了RIA时代富客户端的优点(C/S+B/S) (2)支持多种服务器语言(JAVA..NET.PHP)及主流框架(Spring.Hibernate ...

  4. Reveal:分析iOS UI的利器

    转:http://security.ios-wiki.com/issue-3-4/ Reveal简介 Reveal是分析iOS应用UI的利器: Reveal能够在运行时调试和修改iOS应用程序.它能连 ...

  5. 深入浅出!从语义角度分析隐藏在Unity协程背后的原理

    Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来 ...

  6. 转 理解与分析ios应用的崩溃报告

    理解与分析ios应用的崩溃报告 源网址: http://developer.apple.com/library/ios/#technotes/tn2151/_index.html 当一个应用程序崩溃时 ...

  7. 从程序员的角度分析微信小程序(编程语言:用到什么学什么)

    从程序员的角度分析微信小程序(编程语言:用到什么学什么) 一.总结 一句话总结:微信小程序原理就是用JS调用底层native组件,和React Native非常类似.(需要时,用到时再学) 1.选择语 ...

  8. 从程序员的角度分析微信小程序

    昨天朋友圈被微信小程序刷爆了. 我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先吐槽 微信小程序只发了200 ...

  9. Reveal分析IOS界面,plist文件读取

    Reveal分析IOS界面,需要得到app的 softwareVersionBundleId上传到iphone中 , 而IOS8的iTunesMetadata.plist (设备路径/var/mobi ...

随机推荐

  1. WebService客户端几种实现方式

    1.jdk原生调用(需要获取服务接口文件) import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Ser ...

  2. Winform 下使用WebBrowser的HTML编辑控件—WinHtmlControl 在win7 IE9下的问题

    问题是这样的,有一个需要用到富文本的地方,由于是winform的程序,而且程序是上一代老员工留下的,错误百出,现在要尽量修复,至少保证能正常使用,于是就开始一点点问题修复. 在win7 64位系统下出 ...

  3. Windows2003 + IIS6 安装.Net FrameWork 4.0 兼容早期版本的测试

    看到文档说.net4的框架可以向下兼容2.0.3.0.3.5这几个版本,觉得是一件好事,以后服务器上就不用费时费力的安装 2.0.3.5之类的框架了.但是又觉得奇怪,2.0和3.5的框架都是很大的,为 ...

  4. Linq to Sharepoint--如何获取Linq Query 生成的CALM

    我们知道Linq to sharepoint 实际最终还是转化成了CALM来对Sharepoint进行访问,那么我们怎样才能知道我们编写的Query语句最终转化成的CALM语句是什么样子呢. 我们可以 ...

  5. http之请求方法

    根据HTTP标准,HTTP请求可以使用多种请求方法.HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法.HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE ...

  6. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  7. 大数据,why python

    大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...

  8. 上传jar包至nexus

    上传命令: mvn deploy:deploy-file -DgroupId=com.xxx -DartifactId=xxx-pdf -Dversion=16.10.0 -Dpackaging=ja ...

  9. win10下安装lxml

    最近在windows平台下开发,用的python3.6,安装lxml遇到点问题,现已解决.特意记下,以供以后再遇到. 解决方法: 1.打开cmd终端,查看pip版本,pip --version,如不是 ...

  10. [笔记] SQL性能优化 - 常用语句(二)

    1.查询CPU开销大的语句 total_worker_time/execution_count AS avg_cpu_cost, plan_handle, execution_count, ( , ( ...