iOS上的VOIP應(yīng)用如何能夠更省電?
2012/03/01
近日在網(wǎng)上看到一個(gè)文章,介紹 iPhone、Android 上的熱門的 VOIP 應(yīng)用 Viber,曰:“它可以完全運(yùn)行在后臺(tái),且不會(huì)耗電,即便是不運(yùn)行在后臺(tái),你照樣可以撥打免費(fèi)電話和發(fā)免費(fèi)短信。”
應(yīng)該說,這些說法從技術(shù)上看并不嚴(yán)謹(jǐn)。首先,從這段文字能得到一個(gè)模糊的印象,一個(gè)在后臺(tái)運(yùn)行的程序,并且不會(huì)耗電;其次,“程序即便是不運(yùn)行在后臺(tái),照樣可以撥打免費(fèi)電話和發(fā)短信”,這如何理解呢?程序運(yùn)行在前臺(tái)能否撥打免費(fèi)電話?程序壓根不運(yùn)行時(shí)能否撥打電話?
VOIP 應(yīng)用是一種必須實(shí)現(xiàn)為“多任務(wù)”的業(yè)務(wù),這種業(yè)務(wù)通常是耗電的大戶。因此這段文字背后引出其中一個(gè)有趣的技術(shù)問題,智能設(shè)備上的多任務(wù)的業(yè)務(wù)如何能夠“不會(huì)耗電”?
讓我們先看看智能手機(jī)上的電池電量限制與多任務(wù)需求的關(guān)系。
智能手機(jī)上電池電量限制與多任務(wù)需求
智能手機(jī)與桌面電腦的根本區(qū)別在于智能手機(jī)本身的硬件尺寸與電池電量大小,電池電量對(duì)智能手機(jī)來說是關(guān)鍵而致命的限制,人們要求手機(jī)越來越輕薄,功能越來越強(qiáng)大,然而待電時(shí)間卻要求越來越長(zhǎng),這不是“又要馬兒跑又要馬兒不吃草”的事情么!為此,智能手機(jī)上的電池電量正如沙漠中的水,一點(diǎn)一滴都不可以浪費(fèi)。
為了節(jié)約電池的電量,智能手機(jī)上的操作系統(tǒng)的一個(gè)基本策略是,盡量減少正在運(yùn)行的程序,這個(gè)道理很簡(jiǎn)單,運(yùn)行的程序越多,需要耗費(fèi)的 CPU 計(jì)算時(shí)間就越多,電量就省不下來。下面的圖是蘋果 iOS 設(shè)備應(yīng)用程序調(diào)度狀態(tài)圖,事實(shí)上蘋果設(shè)備是除了用戶正在操作的程序,其他打開的程序進(jìn)程盡可能都放到“掛起(Suspended)”的狀態(tài)下。在“掛起”的狀態(tài)下面,程序進(jìn)程處在休眠狀態(tài),不耗費(fèi) CPU 計(jì)算能力。當(dāng)用戶沒有對(duì)設(shè)備進(jìn)行操作的時(shí)候,整個(gè)系統(tǒng)處在休眠的低電狀態(tài)。(這里進(jìn)程的意思是:程序運(yùn)行實(shí)例)
智能手機(jī)上的 VOIP,作為一種多任務(wù)型的業(yè)務(wù),卻恰恰踩在耗電的雷區(qū)上。VOIP 類的應(yīng)用需要實(shí)現(xiàn)為多任務(wù)原因是需要維持應(yīng)用應(yīng)用與服務(wù)器之間的長(zhǎng)期的網(wǎng)絡(luò)連接,當(dāng)網(wǎng)絡(luò)側(cè)的來電呼叫到達(dá)的時(shí)候,提示用戶進(jìn)行接聽。因此程序有“長(zhǎng)期存活”的“待機(jī)”需求,后臺(tái)長(zhǎng)期存活的程序僅僅能處在“后臺(tái)(Background)”的狀態(tài)下面,這個(gè)狀態(tài)下的程序進(jìn)程,需要耗費(fèi) CPU 計(jì)算能力和電量。為何叫做“多任務(wù)”型的業(yè)務(wù)呢,意思是由于此業(yè)務(wù)的存在,除了用戶交互的程序進(jìn)程,還存在另外的“存活”進(jìn)程。
蘋果 iOS 設(shè)備的 VOIP 實(shí)現(xiàn)
正是由于對(duì)程序耗電量的錙銖必較,蘋果公司曾經(jīng)拒絕實(shí)現(xiàn)“真正”的多任務(wù),使用“快速程序切換”來緩解用戶對(duì)大部分“多任務(wù)”的需求,如今,相信蘋果的研發(fā)團(tuán)隊(duì)是在做了艱難的平衡之后,決定允許部分業(yè)務(wù)實(shí)現(xiàn)為“多任務(wù)”。這些業(yè)務(wù)主要是上文提到的后臺(tái)的音樂播放、后臺(tái)的 GPS 定位服務(wù)、新聞?dòng)嗛啒I(yè)務(wù)的后臺(tái)定期更新、VOIP 應(yīng)用等等,并為后臺(tái)業(yè)務(wù)實(shí)現(xiàn)提供嚴(yán)格的開發(fā)指引。VOIP類的業(yè)務(wù)正是蘋果公司強(qiáng)制管理的一種“多任務(wù)”業(yè)務(wù),如果開發(fā)團(tuán)隊(duì)不遵守架構(gòu)限制,軟件將不能通過審核和在蘋果應(yīng)用商城上發(fā)布,而 Viber,在 iOS 平臺(tái)上,應(yīng)該是遵循了該架構(gòu)。
讓我們來看看蘋果公司為VOIP實(shí)現(xiàn),這種架構(gòu)下如何可能達(dá)到省電的目標(biāo)。
下面描述的文字非開發(fā)指引,僅僅為了幫助理解 VOIP 應(yīng)用進(jìn)程的調(diào)度過程(需要一定的軟件開發(fā)背景來理解):
1、VOIP 應(yīng)用需要在 Info.plist 里配置 UIBackgroundModes 的值為 “VOIP” ,告知系統(tǒng),此乃 VOIP 應(yīng)用。
2、程序配置用于 VOIP 業(yè)務(wù)的網(wǎng)絡(luò)連接(Socket),告知系統(tǒng),在程序進(jìn)程被調(diào)度到“掛起(Suspended)”狀態(tài)時(shí)該特殊的網(wǎng)絡(luò)連接需要被系統(tǒng)接管,因此,此時(shí)網(wǎng)絡(luò)連接仍然是活動(dòng)的。當(dāng)網(wǎng)絡(luò)連接有新的數(shù)據(jù)到達(dá)的時(shí)候,程序?qū)摹皰炱穑⊿uspended)” 狀態(tài)被喚醒到“后臺(tái) (Background)”狀態(tài),如果是個(gè)來電事件,VOIP應(yīng)用則發(fā)起一個(gè)本地提醒事件,此時(shí)用戶可以在設(shè)備的界面上看到來電提醒,如果用戶選擇接聽來電,則 VOIP 應(yīng)用被調(diào)度到前端的“活動(dòng) (Active)”狀態(tài)直接與用戶交互,否則,回退到低電的“掛起(Suspended)”狀態(tài)。下圖可以看到左圖是傳統(tǒng)的 VOIP 應(yīng)用,在“待機(jī)”狀態(tài)下整個(gè)程序都運(yùn)行在耗電的“后臺(tái) (Background)”狀態(tài),右圖是蘋果的 VOIP 實(shí)現(xiàn),僅僅網(wǎng)絡(luò)連接運(yùn)行在耗電的“后臺(tái) (Background)”狀態(tài)。其余系統(tǒng)部分運(yùn)行在低電的“掛起(Suspended)”狀態(tài)。
3、安裝 Keep-Alive 的處理函數(shù)維持與服務(wù)器端的長(zhǎng)連接。VOIP應(yīng)用將被周期性從“掛起(Suspended)”狀態(tài)調(diào)度到“后臺(tái) (Background)”,使 Keep-Alive 的處理函數(shù)能夠定期向網(wǎng)絡(luò)服務(wù)器發(fā)送“心跳”的網(wǎng)絡(luò)包。
總結(jié):在 iOS 實(shí)現(xiàn)的 VOIP 方案中,應(yīng)用進(jìn)程可以看作兩部分,一部分是需要系統(tǒng)內(nèi)核看管的網(wǎng)絡(luò)連接和系統(tǒng)的定期喚醒服務(wù),另一部分是 VOIP 的程序邏輯,在 VOIP 的狀態(tài)下,后一部分被放到了低電的“掛起(Suspended)”狀態(tài),最少的使用了 CPU,因此可以達(dá)到省電的效果。
為何能夠更省電
然后,回到關(guān)于Viber的問題,如何“程序即便是不運(yùn)行在后臺(tái),照樣可以撥打免費(fèi)電話和短信”?據(jù)考究,實(shí)際上應(yīng)為“即便程序不運(yùn)行,照樣可以接聽電話和短信”。原因是,撥打電話和短信,肯定必須有用戶的交互操作,程序只能處在“活動(dòng)(Active)狀態(tài)”,不可能是不運(yùn)行的。根據(jù)Viber的網(wǎng)站的資料,Viber 使用了蘋果的 APNs(Apple Push Notification Service)功能,當(dāng)用戶有電話撥入或者短信發(fā)送過來的時(shí)候,此時(shí)才加載 Viber 應(yīng)用。APNs 服務(wù)是一種 Apple 公司的網(wǎng)絡(luò)端服務(wù),用來向蘋果設(shè)備推送消息,通常也用來實(shí)現(xiàn)郵件推送等功能。
當(dāng)然,使用 APNs 的方式提醒用戶來電和短信,可以更加省電,在“待機(jī)”期間,Viber 程序可以根本沒有運(yùn)行,僅僅當(dāng)有來電和短信的時(shí)候借用了系統(tǒng)提供的 APNS 服務(wù)來喚醒和加載應(yīng)用。
終極的省電方式
當(dāng)然,無論如何優(yōu)化,這種 VOIP 應(yīng)用相比起傳統(tǒng)語音實(shí)現(xiàn)來說仍然是耗電的,因?yàn)檎麄(gè)系統(tǒng)(智能手機(jī)的 AP 部分)不能休眠。在是傳統(tǒng)的非 VOIP 話音業(yè)務(wù)中,如果沒有來電和用戶操作,整個(gè)系統(tǒng)是休眠的,僅僅是基帶芯片(智能手機(jī)的 CP 部分)在工作,負(fù)責(zé)維護(hù)與電信運(yùn)營(yíng)商基站的連接,這無疑是最省電的一種工作方式。
http://www.ifanr.com
相關(guān)閱讀: