夏天来了,iOS开发者们该如何减少App耗电?(上)
theme: v-green
我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛
夏天来了,小伙伴们,你们的手机会发烫呢? (来自灵魂的拷问)
作为一个重度手机使用患者,夏天手机发烫是我们不能容忍的事情。对于App开发者来说,考虑如何去减少电量的消耗也是我们的一个必修课。。。
在前文【夏天来了,App开发者们如何看待手机发烫问题?】中,我们知道手机中APP耗电有四个方面:
What Consumes Energy?
-
Processing
: CPU处理
- Networking
: 网络请求
- Location
:定位
- Graphics
: 屏幕绘制
那么如何减少电量消耗呢?有以下几点需要我们注意:
-
Identify
:保证一致性,可复用
- Optimize
: 优化,更高效
- Coalesce
:合并
- Reduce
: 减少不必要处理
Energy Efficient Coding
作为iOS
开发者,该如何编写省电的代码呢?
Networking
以社交APP为例,网络方面我们可以Feed
、Post a Photo
、Analytics
Feed
对于信息流的处理,我们可以做到在需要时去刷新数据(提升体验的前提下可以预加载),对于已经加载的数据做本地缓存,这样可以节省流量以及不必要的网络开销。
Post a Photo
发送一张图片,通常情况我们会选择立即上传,当上传失败后的重新上传。\
但其实我们可以做的更好,我们可以批处理上传图片,设置超时时间,以及减少重试。达到重试限制后使用后台会话去上传图片。(发送图片资源、媒体资源时,压缩资源也是很必要的)
Analytics
上传用户分析数据,苹果推荐使用NSURLSession Background Session
,好处有自动重试
、全程监控
,以及全新的属性Properties
(包括了Start time
、Workload size
),帮助app知道处理的最佳时机。(适用于一些埋点需求)
``` // Setup NSURLSession Background Session let config = URLSessionConfiguration.background(withIdentifier: "com.socialapp.background") let session = URLSession(configuration: config, delegate: ..., delegateQueue: ...)
// Set discretionary property config.discretionary = true
// Create Request and Task var request = URLRequest(url: URL(string: "https://www.example.com/")!)request.addValue("...", forHTTPHeaderField: “...”) let task = session.downloadTask(with: request)
// Set time window task.earliestBeginDate = Date(timeIntervalSinceNow: 2 * 60 * 60) // Set workload size task.countOfBytesClientExpectsToSend = 80 task.countOfBytesClientExpectsToReceive = 2048 task.resume() ```
最佳实践 (Best Practices )
Identify
: 确保事务不重复Optimize
: 使用background session
Coalesce
:批处理事务Reduce
: 减少重试次数
Location
Location API
中包含了 \
Continuous location(持续定位)
、\
Quick location update(快速更新位置)
、\
Region monitoring(区域监测)
、\
Visit monitoring(访问监测)
、\
Significant location change(显著的位置变化)
等多个类型。
苹果建议合理的使用API可以减低耗电。
``` // Create location manager locationManager = CLLocationManager locationManager.delegate = self locationManager.requestWhenInUseAuthorization()
// Set desired accuracy, auto-pause, and activity type appropriately locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers locationManager.pausesLocationUpdatesAutomatically = true locationManager.activityType = CLActivityTypeNavigation
// Set allows background if its needed locationManager.allowsBackgroundLocationUpdates = true
// Start location updates locationManager.startUpdatingLocation()
// Stop location when no longer needed locationManager.stopUpdatingLocation() ```
最佳实践 (Best Practices )
Identify
: 清楚 app 需要的定位精确度(适合你的需求就好)Optimize
: 使用其它来替代Continuous location
(因为这个真的很耗电)Coalesce
:不需要使用定位时,就停止定位Reduce
: 延后定位更新
Graphics
关于图像处理有两条建议:
1. 保证在 UI 真的需要有变化时,进行屏幕更新;
2. 避免使用高斯模式blur
。另外MacOS
尽量少使用独立显卡。
最佳实践 (Best Practices )
Identify
: 高斯模糊的使用Optimize
:MacOS
尽量少使用独立显卡,只在动画性能吃紧、或者其独有功能时才去使用它Reduce
: 在UI真的有必要变化时,更新屏幕
Processing
CPU
方面需要明确 app 要完成的任务,并且高效的完成任务,避免使用定时器timer
,如果必须使用,设置一个较长的间隔时间。
最佳实践 (Best Practices )
Identify
: 在后台完成工作Optimize
: 使用后台应用刷新Coalesce
: 使用background session
Reduce
: 限制事务处理
以上这些是在编码中需要注意的地方,但是我们还需要工具来检测App的耗电量,关于Debug Tools
,我们下篇文章再聊!
- LeetCode 初级算法之数组(上),看看你都学会了吗?
- LeetCode 初级算法之链表,看看你都学会了吗?
- LeetCode 初级算法之字符串(上),看看你都学会了吗?
- 纯代码布局,也可以一样的简洁
- UIStackView之一问一答
- 使用UIStackView来简化iOS的界面布局
- 夏天来了,iOS开发者们该如何减少App耗电?(上)
- 夏天来了,App开发者们如何看待手机发烫问题?
- 聊聊iOS中UITableView复用的那些事
- 曾经经典的微信打飞机游戏还有人记得吗?
- iOS 原生渲染与 Flutter 有什么区别 (上)
- 了解 Mach-O文件
- CocoaPods中podsepc文件设置详解
- iOS 原生渲染与 Flutter 有什么区别 (下)
- 简单了解 iOS CVPixelBuffer (上)
- 谈谈 iOS 包瘦身方案
- 播放器重构的探索之路
- 如何使用CocoaPods制作私有库
- iOS 组件化方案