iOS上VoIP應(yīng)用使用蘋(píng)果網(wǎng)絡(luò)終端服務(wù)APNs省電

責(zé)任編輯:hli

2012-03-01 10:35:18

摘自:騰訊科技

近日在網(wǎng)上看到一個(gè)文章,介紹 iPhone、Android 上的熱門(mén)的 VOIP 應(yīng)用 Viber ,曰:它可以完全運(yùn)行在后臺(tái),且不會(huì)耗電,

近日在網(wǎng)上看到一個(gè)文章,介紹 iPhone、Android 上的熱門(mén)的 VOIP 應(yīng)用 Viber ,曰:

它可以完全運(yùn)行在后臺(tái),且不會(huì)耗電,即便是不運(yùn)行在后臺(tái),你照樣可以撥打免費(fèi)電話和發(fā)免費(fèi)短信。

應(yīng)該說(shuō),這些說(shuō)法從技術(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ù)問(wèn)題,智能設(shè)備上的多任務(wù)的業(yè)務(wù)如何能夠“不會(huì)耗電”?

讓我們先看看智能手機(jī)上的電池電量限制與多任務(wù)需求的關(guān)系。

智能手機(jī)上電池電量限制與多任務(wù)需求

智能手機(jī)與桌面電腦的根本區(qū)別在于智能手機(jī)本身的硬件尺寸與電池電量大小,電池電量對(duì)智能手機(jī)來(lái)說(shuō)是關(guān)鍵而致命的限制,人們要求手機(jī)越來(lái)越輕薄,功能越來(lái)越強(qiáng)大,然而待電時(shí)間卻要求越來(lái)越長(zhǎng),這不是“又要馬兒跑又要馬兒不吃草”的事情么!為此,智能手機(jī)上的電池電量正如沙漠中的水,一點(diǎn)一滴都不可以浪費(fèi)。

為了節(jié)約電池的電量,智能手機(jī)上的操作系統(tǒng)的一個(gè)基本策略是,盡量減少正在運(yùn)行的程序,這個(gè)道理很簡(jiǎn)單,運(yùn)行的程序越多,需要耗費(fèi)的 CPU 計(jì)算時(shí)間就越多,電量就省不下來(lái)。下面的圖是蘋(píng)果iOS 設(shè)備應(yīng)用程序調(diào)度狀態(tài)圖,事實(shí)上蘋(píng)果設(shè)備是除了用戶正在操作的程序,其他打開(kāi)的程序進(jìn)程盡可能都放到“掛起(Suspended)”的狀態(tài)下。在“掛起”的狀態(tài)下面,程序進(jìn)程處在休眠狀態(tài),不耗費(fèi) CPU 計(jì)算能力。當(dāng)用戶沒(méi)有對(duì)設(shè)備進(jìn)行操作的時(shí)候,整個(gè)系統(tǒng)處在休眠的低電狀態(tài)。(這里進(jìn)程的意思是:程序運(yùn)行實(shí)例)

智能手機(jī)上的 VOIP,作為一種多任務(wù)型的業(yè)務(wù),卻恰恰踩在耗電的雷區(qū)上。VOIP 類(lèi)的應(yīng)用需要實(shí)現(xiàn)為多任務(wù)原因是需要維持應(yīng)用應(yīng)用與服務(wù)器之間的長(zhǎng)期的網(wǎng)絡(luò)連接,當(dāng)網(wǎng)絡(luò)側(cè)的來(lái)電呼叫到達(dá)的時(shí)候,提示用戶進(jìn)行接聽(tīng)。因此程序有“長(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)程。

蘋(píng)果 iOS 設(shè)備的 VOIP 實(shí)現(xiàn)

正是由于對(duì)程序耗電量的錙銖必較,蘋(píng)果公司曾經(jīng)拒絕實(shí)現(xiàn)“真正”的多任務(wù),使用“快速程序切換”來(lái)緩解用戶對(duì)大部分“多任務(wù)”的需求,如今,相信蘋(píng)果的研發(fā)團(tuán)隊(duì)是在做了艱難的平衡之后,決定允許部分業(yè)務(wù)實(shí)現(xiàn)為“多任務(wù)”。這些業(yè)務(wù)主要是上文提到的后臺(tái)的音樂(lè)播放、后臺(tái)的 GPS 定位服務(wù)、新聞?dòng)嗛啒I(yè)務(wù)的后臺(tái)定期更新、VOIP 應(yīng)用等等,并為后臺(tái)業(yè)務(wù)實(shí)現(xiàn)提供嚴(yán)格的開(kāi)發(fā)指引。VOIP類(lèi)的業(yè)務(wù)正是蘋(píng)果公司強(qiáng)制管理的一種“多任務(wù)”業(yè)務(wù),如果開(kāi)發(fā)團(tuán)隊(duì)不遵守架構(gòu)限制,軟件將不能通過(guò)審核和在蘋(píng)果應(yīng)用商城上發(fā)布,而 Viber,在 iOS 平臺(tái)上,應(yīng)該是遵循了該架構(gòu)。

讓我們來(lái)看看蘋(píng)果公司為VOIP實(shí)現(xiàn),這種架構(gòu)下如何可能達(dá)到省電的目標(biāo)。

下面描述的文字非開(kāi)發(fā)指引,僅僅為了幫助理解 VOIP 應(yīng)用進(jìn)程的調(diào)度過(guò)程(需要一定的軟件開(kāi)發(fā)背景來(lái)理解):

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ū)?ldquo;掛起(Suspended)” 狀態(tài)被喚醒到“后臺(tái) (Background)”狀態(tài),如果是個(gè)來(lái)電事件,VOIP應(yīng)用則發(fā)起一個(gè)本地提醒事件,此時(shí)用戶可以在設(shè)備的界面上看到來(lái)電提醒,如果用戶選擇接聽(tīng)來(lái)電,則 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),右圖是蘋(píng)果的 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的問(wèn)題,如何“程序即便是不運(yùn)行在后臺(tái),照樣可以撥打免費(fèi)電話和短信”?據(jù)考究,實(shí)際上應(yīng)為“即便程序不運(yùn)行,照樣可以接聽(tīng)電話和短信”。原因是,撥打電話和短信,肯定必須有用戶的交互操作,程序只能處在“活動(dòng)(Active)狀態(tài)”,不可能是不運(yùn)行的。根據(jù)Viber的網(wǎng)站的資料,Viber 使用了蘋(píng)果的 APNs(Apple Push Notification Service)功能,當(dāng)用戶有電話撥入或者短信發(fā)送過(guò)來(lái)的時(shí)候,此時(shí)才加載 Viber 應(yīng)用。APNs 服務(wù)是一種 Apple 公司的網(wǎng)絡(luò)端服務(wù),用來(lái)向蘋(píng)果設(shè)備推送消息,通常也用來(lái)實(shí)現(xiàn)郵件推送等功能。

當(dāng)然,使用 APNs 的方式提醒用戶來(lái)電和短信,可以更加省電,在“待機(jī)”期間,Viber 程序可以根本沒(méi)有運(yùn)行,僅僅當(dāng)有來(lái)電和短信的時(shí)候借用了系統(tǒng)提供的 APNS 服務(wù)來(lái)喚醒和加載應(yīng)用。

終極的省電方式

當(dāng)然,無(wú)論如何優(yōu)化,這種 VOIP 應(yīng)用相比起傳統(tǒng)語(yǔ)音實(shí)現(xiàn)來(lái)說(shuō)仍然是耗電的,因?yàn)檎麄€(gè)系統(tǒng)(智能手機(jī)的 AP 部分)不能休眠。在傳統(tǒng)的非 VOIP 話音業(yè)務(wù)中,如果沒(méi)有來(lái)電和用戶操作,整個(gè)系統(tǒng)是休眠的,僅僅是基帶芯片(智能手機(jī)的 CP 部分)在工作,負(fù)責(zé)維護(hù)與電信運(yùn)營(yíng)商基站的連接,這無(wú)疑是最省電的一種工作方式。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)