從開發者的角度分析iOS應如何省電

史前圖騰發表於2019-03-04

說明

網上關於iPhone如何省電的文章很多.但是基本沒有講原理.
而在生活中,很多人在使用iPhone中有著明顯的錯誤的省電習慣.

本文從iOS開發者的角度,對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的前臺執行時間和後臺執行時間.

從開發者的角度分析iOS應如何省電

對於某些後臺執行時間明顯異常的應用,應該嘗試關閉許可權或直接殺死,以避免在後臺長時間執行耗電.

比如我就遇到過,某個手環app在一次更新後,定位功能未及時關閉,一直在後臺執行並不斷定位,一晚上耗電70%.通過改變定位許可權來限制後臺耗電.

關閉不必要許可權

這裡的許可權主要指三個:一個是定位許可權,能只給使用時定位許可權,就儘量不給始終定位許可權,當然,對於導航應用來說,如果不給始終定位許可權的話,就無法在後臺語音導航了;

另一個是後臺應用重新整理,這個許可權不會提示,需要自己在應用安裝後手動關閉.對於微信之類的常用app可以保留,不常用的建議關閉.關閉這個許可權並不影響收取通知.

還有一個是通知的許可權,有通知就會反覆喚醒手機,當app同時有後臺應用重新整理許可權時,還有可能被通知喚醒,在後臺啟動.

降低螢幕亮度

適當降低螢幕亮度可以省電,這個似乎沒有什麼需要解釋的.

禁用抬起喚醒等系統功能

還是在設定—電池,頁面中,可以禁用這個功能,這樣手機就不會因為隨便翻動手機而亮屏了,需要點亮螢幕時可以手動按Home鍵點亮.但對於iPhoneX就不適用了.還可以縮短螢幕鎖定的時間,比如改為30秒.

還可以根據自己的需要,禁用系統更新,iCloud同步,siri喚醒等.

但如果你不想永久禁用這些功能,只想在外出旅途中儘可能節省電量,那可以啟用低電量模式.

啟用低電量模式

iPhone預設在電量只有20%時進入低電量模式,但是我們也可以手動進入低電量模式來延長續航.

進入低電量模式後:
螢幕鎖定時間強制改為30秒;
螢幕亮度稍微降低;
應用後臺喚醒頻率大大降低;
網路和藍芽模組掃瞄頻率,連線速度等都會降低;
CPU執行頻率降低;
系統動畫效果減弱;
定位頻率降低;
自動禁用軟體更新和iCloud同步;
禁用siri語音喚醒…

從開發者的角度分析iOS應如何省電

一套組合拳下來,省電效果十分突出.適用於突然需要外出一整天,卻沒有帶充電寶的情況.

慎重使用殺程式

前面說到,手動殺死程式後,一般情況下系統不會再喚醒了,所以殺死一些應用可以省電.

但是有些應用是需要經常啟動的,比如微信,一天可能需要看上百次,如果反覆殺死上百次,再反覆重新啟動上百次,耗電只會更多.

慎重關閉藍芽和wifi

正常情況下,在待機時,藍芽和wifi耗電極少,但在定位時卻可以有效加速定位.極端情況下需要省電,也應該使用低電量模式,這樣省電最明顯.除非確定自己不需要藍芽和wifi功能,也不需要使用定位功能(也沒有應用在後臺定位或使用地理圍欄),那麼再考慮關閉.

總結

在明白了iOS系統的前臺後臺原理後,我們就可以知道,在平時生活中,我們只需要經常檢視耗電情況關閉不必要許可權這兩招,就可以很好的控制iOS的耗電情況.

必要時再加上啟用低電量模式,並儘可能少使用那些重度依賴網路,定位,相機,視訊功能的app就可以了.

如果還不能滿足你的要求,只能隨身帶充電寶或者等以後蘋果更新大容量電池的iPhone了.

相關文章