夏天來了,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: "http://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 元件化方案