夏天來了,iOS開發者們該如何減少App耗電?(上)

語言: CN / TW / HK

theme: v-green

我正在參加「初夏創意投稿大賽」詳情請看:初夏創意投稿大賽

夏天來了,小夥伴們,你們的手機會發燙呢? (來自靈魂的拷問)

作為一個重度手機使用患者,夏天手機發燙是我們不能容忍的事情。對於App開發者來説,考慮如何去減少電量的消耗也是我們的一個必修課。。。

在前文【夏天來了,App開發者們如何看待手機發燙問題?】中,我們知道手機中APP耗電有四個方面:

What Consumes Energy?

截屏2022-05-26 下午4.46.24.png - Processing : CPU處理 - Networking : 網絡請求 - Location :定位 - Graphics : 屏幕繪製

那麼如何減少電量消耗呢?有以下幾點需要我們注意: 截屏2022-05-26 下午3.42.31.png - Identify :保證一致性,可複用 - Optimize : 優化,更高效 - Coalesce :合併 - Reduce : 減少不必要處理

Energy Efficient Coding

作為iOS開發者,該如何編寫省電的代碼呢?

Networking

以社交APP為例,網絡方面我們可以FeedPost a PhotoAnalytics 截屏2022-05-26 下午5.18.15.png

Feed

對於信息流的處理,我們可以做到在需要時去刷新數據(提升體驗的前提下可以預加載),對於已經加載的數據做本地緩存,這樣可以節省流量以及不必要的網絡開銷。 截屏2022-05-26 下午6.09.01.png

Post a Photo

發送一張圖片,通常情況我們會選擇立即上傳,當上傳失敗後的重新上傳。\ 但其實我們可以做的更好,我們可以批處理上傳圖片,設置超時時間,以及減少重試。達到重試限制後使用後台會話去上傳圖片。(發送圖片資源、媒體資源時,壓縮資源也是很必要的) 截屏2022-05-26 下午5.17.36.png

Analytics

上傳用户分析數據,蘋果推薦使用NSURLSession Background Session,好處有自動重試全程監控,以及全新的屬性Properties(包括了Start timeWorkload size),幫助app知道處理的最佳時機。(適用於一些埋點需求) 截屏2022-05-26 下午5.17.21.png

``` // 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可以減低耗電。 截屏2022-05-26 下午7.07.11.png

``` // 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() ```

截屏2022-05-26 下午7.18.05.png

最佳實踐 (Best Practices )

  • Identify清楚 app 需要的定位精確度(適合你的需求就好)
  • Optimize使用其它來替代 Continuous location(因為這個真的很耗電)
  • Coalesce不需要使用定位時,就停止定位
  • Reduce延後定位更新

Graphics

關於圖像處理有兩條建議: 1. 保證在 UI 真的需要有變化時,進行屏幕更新; 2. 避免使用高斯模式blur。另外MacOS 儘量少使用獨立顯卡。

截屏2022-05-26 下午7.45.43.png

截屏2022-05-26 下午7.46.16.png

最佳實踐 (Best Practices )

  • Identify高斯模糊的使用
  • OptimizeMacOS 儘量少使用獨立顯卡,只在動畫性能吃緊、或者其獨有功能時才去使用它
  • Reduce在UI真的有必要變化時,更新屏幕

Processing

CPU方面需要明確 app 要完成的任務,並且高效的完成任務,避免使用定時器timer,如果必須使用,設置一個較長的間隔時間。 截屏2022-05-26 下午7.47.56.png

截屏2022-05-26 下午7.49.02.png

截屏2022-05-26 下午7.52.54.png

最佳實踐 (Best Practices )

  • Identify在後台完成工作
  • Optimize使用後台應用刷新
  • Coalesce使用background session
  • Reduce限制事務處理

以上這些是在編碼中需要注意的地方,但是我們還需要工具來檢測App的耗電量,關於Debug Tools,我們下篇文章再聊!