iOS之性能优化·优化App的电池耗电量
生活随笔
收集整理的這篇文章主要介紹了
iOS之性能优化·优化App的电池耗电量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前言
- 在現如今的開發中,電量消耗是一個應用運行效果的一個重要的衡量標準,尤其是直播和運動應用等,設備中的每個硬件模塊都會消耗電量。
- 電量的最大消費者是 CPU,但這只是系統的一個方面,一個編寫良好的應用需要謹慎地使用電能,用戶往往會刪除耗電量大的應用。除 CPU 外,耗電量高、值得關注的硬件模塊還包括網絡硬件、藍牙、GPS、麥克風、加速計、攝像頭、揚聲器和屏幕等。
- 如何降低電量的消耗,是延長使用時間的關鍵,因此需要關注以下幾個方面:
-
- 判斷電池的剩余電量及充電狀態;
-
- 如何分析電源;
-
- 如何在 iOS 應用中分析電源,CPU 和資源的使用。
二、CPU
- 不論用戶是否正在直接使用,CPU 都是應用所使用的主要硬件,在后臺操作和處理推送通知時,應用仍然會消耗 CPU 資源。如下圖所示:
- 應用計算的越多,消耗的電量越多。在完成相同的基本操作時,老一代的設備會消耗更多的電量,計算量的消耗取決于不同的因素:
-
- 對數據的處理;
-
- 待處理的數據大小,更大的顯示屏允許軟件在單個視圖中展示更多的信息,但這也意味著要處理更多的數據;
-
- 處理數據的算法和數據結構;
-
- 執行更新的次數,尤其是在數據更新后,觸發應用的狀態或 UI 進行更新(應用收到的推送通知也會導致數據更新,如果此用戶正在使用應用,還需要更新 UI)。
- 沒有單一原則可以減少設備中的執行次數,很多規則都取決于操作的本質,以下是一些可以在應用中投入使用的最佳實踐:
-
- 針對不同的情況選擇優化的算法;
-
- 如果應用從服務器接受數據,盡量減少需要在客戶端進行的處理;
-
- 優化靜態編譯(ahead-of-time,AOT)處理,動態編譯處理的缺點在于會強制用戶等待操作完成,但是激進的 AOT 處理則會導致計算資源的浪費,需要根據應用和設備選擇精確定量的 AOT 處理。
三、網絡
- 智能的網絡訪問管理可以讓應用響應的更快,并有助于延長電池壽命,在無法訪問網絡時,應該推遲后續的網絡請求,直到網絡連接恢復為止。
- 此外,應避免在沒有連接 WiFi 的情況下進行高寬帶消耗的操作,比如視頻流,眾所周知,蜂窩無線系統(LTE,4G,3G 等)對電量的消耗遠遠大于 WiFi 信號,根源在于 LTE 設備基于多輸入、多輸出技術,使用多個并發信號以維護兩端的 LTE 鏈接。
- 類似的,所有的蜂窩數據鏈接都會定期掃描以尋找更強的信號,因此需要:
-
- 在進行任何網絡操作之前,先檢查合適的網絡連接是否可用;
-
- 持續監視網絡的可用性,并在鏈接狀態發生變化時給與適當的反饋。
- 官方提供了檢查和監聽網絡狀態的變化的代碼,大多數人使用的網絡庫 AFNetWorking 也提供了類似的代碼,可以任選其一,亦或是自己編寫。
四、定位管理器和 GPS
① 定位服務
- 定位服務包括 GPS(或 GLONASS)和 WiFi 硬件以及蜂窩網絡。因此,iOS 的定位有三種方式:
-
- 衛星定位;
-
- 蜂窩基站定位;
-
- Wi-Fi 定位。
- 定位服務是很耗電的,使用 GPS 計算坐標需要確定兩點信息:
-
- 時間鎖:每個 GPS 衛星每毫秒廣播唯一一個 1023 位隨機數,因而數據傳播速率是1.024Mbit/s,GPS 的接收芯片必須正確的與衛星的時間鎖槽對齊。
-
- 頻率鎖:GPS 接收器必須計算由接收器與衛星的相對運動導致的多普勒偏移帶來的信號誤差。
- 計算坐標會不斷的使用 CPU 和 GPS 的硬件資源,因此會迅速的消耗電池電量。
- 初始化 CLLocationManager 并高效接受地理位置更新的示例代碼如下:
② 最佳初始化
- distanceFilter 只要設備的移動超過了最小的距離,距離過濾器就會導致管理器對委托對象的 LocationManager:didUpdateLocations: 事件通知發生變化,該距離單位是 M;
- desiredAccuracy 精度參數的使用直接影響了使用天線的個數,進而影響了對電池的消耗,精度級別的選取取決于應用的具體用途。精度是一個枚舉,我們應該依照不同的需求去恰當的選取精度級別。
- 距離過濾器只是軟件層面的過濾器,而精度級別會影響物理天線的使用。當委托方法 LocationManager:didUpdateLocations: 被調用時,使用距離范圍更廣泛的過渡器只會影響間隔,另一方面,更高的精度級別意味著更多的活動天線,這會消耗更多的能量。
③ 關閉無關緊要的特性
- 判斷何時需要跟蹤位置的變化,在需要跟蹤的時候調用 startUpdatingLocation 方法, 無須跟蹤時調用 stopUpdatingLocation 方法。
- 當應用在后臺運行或用戶沒有與別人聊天時,也應該關閉位置跟蹤,即瀏覽媒體庫,查看朋友列表或調整應用設置時,都應該關閉位置跟蹤。
④ 只在必要時使用網絡
- 為了提高電量的使用效率,iOS 總是盡可能地保持無線網絡關閉,當應用需要建立網絡連接時,iOS 會利用這個機會向后臺應用分享網絡會話,以便一些低優先級能夠被處理,如推送通知、收取電子郵件等。
- 每當用戶建立網絡連接時,網絡硬件都會在連接完成后多維持幾秒的活動時間,每次集中的網絡通信都會消耗大量的電量。要想減輕這個問題帶來的危害,軟件需要有所保留的的使用網絡,應該定期集中短暫的使用網絡,而不是持續的保持著活動的數據流,只有這樣網絡硬件才有機會關閉。
⑤ 后臺定位服務
- CLLocationManager 提供了一個替代的方法來監聽位置的更新,[self.manager startMonitoringSignificantLocationChanges] 可以在更遠的距離跟蹤運動,精確的值由內部決定,且與 distanceFilter 無關。
- 使用這一模式可以在應用進入后臺后繼續跟蹤運動,典型的做法是在應用進入后臺時執行 startMonitoringSignificantLocationChanges 方法,而當應用回到前臺時執行 startUpdatingLocation,代碼如下:
⑥ 在應用關閉后重啟
- 當應用位于后臺時,任何定時器或線程都會掛起。如果在應用位于后臺狀態時申請了定位,那么應用會在每次收到更新后被短暫的喚醒,在此期間,線程和計時器都會被喚醒。
- 在其他應用需要更多資源時,后臺的應用可能會被關閉。在這種情況下,一旦發生位置變化,應用會被重啟,因而需要重新初始化監聽過程,若出現這種情況 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法會受到鍵值為 UIApplicationLaunchOptionsLocationKey 的條目,在應用關閉后重新初始化監聽,如下所示:
五、屏幕
- 屏幕非常耗電,屏幕越大就越耗電。當然,如果應用在前臺運行且與用戶進行交互,則勢必會使用屏幕并消耗電量。但是仍然有一些方案可以優化屏幕的使用,來減少電池的電量消耗。
① 動畫
- 當應用在前臺時,使用動畫,一旦應用進入了后臺,則立即暫停動畫。
- 通常來說,可以通過監聽 UIApplicationWillResignActiveNotification 或UIApplicationDIdEnterBackgroundNotification 的通知事件來暫停或停止動畫,也可以通過監聽 UIApplicationDidBecomeActiveNotification 的通知事件來恢復動畫。
② 視頻播放
- 在視頻播放期間,最好保持屏幕常亮,可以使用 UIApplication 對象的 idleTimerDisabled 屬性來實現這個目的,一旦設置了 YES,就會阻止屏幕休眠,從而實現常亮。
- 與動畫類似,可以通過相應應用的通知來釋放和獲取鎖。
③ 多屏幕
- 使用屏幕比休眠鎖或暫停/恢復動畫要復雜得多。如果正在播放電影或運行動畫,你可以將它們從設備的屏幕挪到外部屏幕,而只在設備的屏幕上保留最基本的設置,這樣可以減少設備上的屏幕更新,進而延長電池壽命。
- 處理這一場景,會涉及以下步驟:
-
- 在啟動期間監測屏幕的數量,如果屏幕數量大于1,則進行切換;
-
- 監聽屏幕在鏈接和斷開時的通知,如果有新的屏幕加入,則進行切換。如果所有的外部屏幕都被移除,則恢復到默認顯示。
六、其他硬件
- 當應用進入后臺的時候, 應該釋放對這些硬件的鎖定:藍牙、相機、揚聲器(除非應用是音樂類的)、麥克風等,基本規則: 只有當應用處于前臺時才與這些硬件進行交互,,應用處于后臺時應停止交互。
- 不過揚聲器和無線藍牙可能例外,如果你正在開發音樂,收音機或其他的音頻類應用,則需要在應用進入后臺后繼續使用揚聲器,不要讓屏幕僅僅為音頻播放的目的而保持常亮。
- 類似的,若應用還有未完成的數據傳輸,則需要在應用進入后臺后持續使用無線藍牙,如:與其他設備傳輸文件。
七、電池電量與代碼感知
- 一個智能的應用會考慮到電池的電量和自身的狀態,從而決定是否執行資源密集消耗性的操作(比如掃二維碼時的手電),另外一個有價值的點是對充電的判斷,確定設備是否處于充電狀態。
- 代碼實施如下:
- 應用對 CPU 的利用率:
- 當剩余電量較低時,提醒用戶并請求用戶授權執行電源密集型的操作。當然,只有在用戶同意的前提下執行,總是用一個指示符(也就是進度條百分比)顯示長時間任務的進度,包括設備上即將完成的計算或者只是下載一些內容,向用戶提供完成進度的估算,以幫助他們決定是否需要為設備充電。
八、最佳實踐
- 以下的最佳實踐可以確保對電量的謹慎使用,遵循以下要點,應用可以實現對電量的高效使用:
-
- 最小化硬件使用,換句話說,盡可能晚的與硬件打交道,并且一旦完成任務立即結束使用;
-
- 在進行密集型任務前,檢查電池電量和充電狀態;
-
- 在電量低時,提示用戶是否確定要執行任務,并在用戶同意后再執行;
-
- 或提供設置的選項,允許用戶定義電量的閾值,以便在執行密集型操作前提示用戶。
- 設置電量的閾值以提示用戶如下:
- 設置由兩個條目組成 promptForBattery(應用設置中的撥動開關,表明是否要在低電量時給予提示)和 miniBatteryLevel(區間為0~100的一個滑塊,表明最低電量),在實際項目中應用的開發人員通常根據操作的復雜性和密集性對閾值進行預設,不同的密集型操作可能會有不同的最低電量需求。
- 在實際執行密集操作之前,檢查當前電量是否足夠,或者手機是否正在充電,這就是我們判斷是否可以進行后續處理的邏輯。
總結
以上是生活随笔為你收集整理的iOS之性能优化·优化App的电池耗电量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HarmonyOS之深入解析媒体会话的管
- 下一篇: iOS之性能优化·提高App的编译速度