1. 程式人生 > >從開發者的角度分析iOS應如何省電

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

後臺 音箱 保留 生活 ack pad image 設定 支持

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

說明

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

本文從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的前臺運行時間和後臺運行時間.

技術分享圖片

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

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

關閉不必要權限

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

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

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

降低屏幕亮度

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

禁用擡起喚醒等系統功能

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

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

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

啟用低電量模式

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

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

技術分享圖片

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

慎重使用殺進程

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

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

慎重關閉藍牙和wifi

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

總結

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

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

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

來自 掘金 作者 :史前圖騰 源鏈接:https://juejin.im/post/5afd82f15188254270642ff0

2018 年 05 月 17 日

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