iOS 上的 VOIP 應用,如何能夠更省電?

2021-06-10 06:55:49 字數 2594 閱讀 8423

好文推薦:

近日在網上看到乙個文章,介紹 iphone、android 上的熱門的 voip 應用 viber ,曰:

它可以完全執行在後台,且不會耗電,即便是不執行在後台,你照樣可以撥打免費**和發免費簡訊。

應該說,這些說法從技術上看並不嚴謹。首先,從這段文字能得到乙個模糊的印象,乙個在後台執行的程式,並且不會耗電;其次,「程式即便是不執行在後台,照樣可以撥打免費**和發簡訊」,這如何理解呢?程式執行在前台能否撥打免費**?程式壓根不執行時能否撥打**?

voip 應用是一種必須實現為「多工」的業務,這種業務通常是耗電的大戶。因此這段文字背後引出其中乙個有趣的技術問題,智慧型裝置上的多工的業務如何能夠「不會耗電」?

讓我們先看看智慧型手機上的電池電量限制與多工需求的關係。

智慧型手機上電池電量限制與多工需求

智慧型手機與桌面電腦的根本區別在於智慧型手機本身的硬體尺寸與電池電量大小,電池電量對智慧型手機來說是關鍵而致命的限制,人們要求手機越來越輕薄,功能越來越強大,然而待電時間卻要求越來越長,這不是「又要馬兒跑又要馬兒不吃草」的事情麼!為此,智慧型手機上的電池電量正如沙漠中的水,一點一滴都不可以浪費。

為了節約電池的電量,智慧型手機上的作業系統的乙個基本策略是,儘量減少正在執行的程式,這個道理很簡單,執行的程式越多,需要耗費的 cpu 計算時間就越多,電量就省不下來。下面的圖是蘋果 ios 裝置應用程式排程狀態圖,事實上蘋果裝置是除了使用者正在操作的程式,其他開啟的程式程序盡可能都放到「掛起(suspended)」的狀態下。在「掛起」的狀態下面,程式程序處在休眠狀態,不耗費  cpu 計算能力。當使用者沒有對裝置進行操作的時候,整個系統處在休眠的低電狀態。(這裡程序的意思是:程式執行例項)

智慧型手機上的 voip,作為一種多工型的業務,卻恰恰踩在耗電的雷區上。voip 類的應用需要實現為多工原因是需要維持應用應用與伺服器之間的長期的網路連線,當網路側的來電呼叫到達的時候,提示使用者進行接聽。因此程式有「長期存活」的「待機」需求,後台長期存活的程式僅僅能處在「後台(background)」的狀態下面,這個狀態下的程式程序,需要耗費 cpu 計算能力和電量。為何叫做「多工」型的業務呢,意思是由於此業務的存在,除了使用者互動的程式程序,還存在另外的「存活」程序。

蘋果 ios 裝置的 voip 實現

讓我們來看看蘋果公司為voip實現,這種架構下如何可能達到省電的目標。

下面描述的文字非開發指引,僅僅為了幫助理解 voip 應用程序的排程過程(需要一定的軟體開發背景來理解):

1、voip 應用需要在 info.plist 裡配置 uibackgroundmodes 的值為 「voip」 ,告知系統,此乃  voip 應用。

2、程式配置用於 voip 業務的網路連線(socket),告知系統,在程式程序被排程到「掛起(suspended)」狀態時該特殊的網路連線需要被系統接管,因此,此時網路連線仍然是活動的。當網路連線有新的資料到達的時候,程式將從「掛起(suspended)」 狀態被喚醒到「後台 (background)」狀態,如果是個來電事件,voip應用則發起乙個本地提醒事件,此時使用者可以在裝置的介面上看到來電提醒,如果使用者選擇接聽來電,則  voip  應用被排程到前端的「活動 (active)」狀態直接與使用者互動,否則,回退到低電的「掛起(suspended)」狀態。下圖可以看到左圖是傳統的  voip  應用,在「待機」狀態下整個程式都執行在耗電的「後台 (background)」狀態,右圖是蘋果的  voip  實現,僅僅網路連線執行在耗電的「後台 (background)」狀態。其餘系統部分執行在低電的「掛起(suspended)」狀態。

3、安裝 keep-alive 的處理函式維持與伺服器端的長連線。voip應用將被週期性從「掛起(suspended)」狀態排程到「後台 (background)」,使 keep-alive 的處理函式能夠定期向網路伺服器傳送「心跳」的網路包。

總結:在 ios 實現的 voip 方案中,應用程序可以看作兩部分,一部分是需要系統核心看管的網路連線和系統的定期喚醒服務,另一部分是 voip 的程式邏輯,在 voip 的狀態下,後一部分被放到了低電的「掛起(suspended)」狀態,最少的使用了 cpu,因此可以達到省電的效果。

為何能夠更省電

當然,使用 apns 的方式提醒使用者來電和簡訊,可以更加省電,在「待機」期間,viber 程式可以根本沒有執行,僅僅當有來電和簡訊的時候借用了系統提供的 apns 服務來喚醒和載入應用。

終極的省電方式

當然,無論如何優化,這種 voip 應用相比起傳統語音實現來說仍然是耗電的,因為整個系統(智慧型手機的 ap 部分)不能休眠。在是傳統的非 voip 話音業務中,如果沒有來電和使用者操作,整個系統是休眠的,僅僅是基帶晶元(智慧型手機的 cp 部分)在工作,負責維護與電信運營商基站的連線,這無疑是最省電的一種工作方式。

fetch 使用,如何能夠接收JS的傳值

使用fetch基本方式 fetch then function res 方式一 增加headers 定義 在headers頭部定義如下 同時body傳值使用如下方式 body username uname password password在php中使用如下接收 input username 方式二...

pytorch如何能夠保證模型的可重複性

問題背景是這樣的 我用了自己定義了pytorch中的模型,並且,在main函式中設定了隨機種子用來保證模型初始化的引數是一致的,同時pytorch中的隨機種子也能夠影響dropout的作用,見鏈結 為了保證所有的引數都一樣,我在設定dataloader的時候,資料並沒有進行shuffle,這樣能夠在...

AI應用在金融領域,如何能夠在商業上有所突破

ai應用在金融領域,如何能夠在商業上有所突破 如今,隨著社會不斷發展,技術不斷進步,國內外各大金融機構已經在大資料 人工智慧 區塊鏈等新技術上有很多嘗試,智慧型客服 智慧型投顧等新金融形式也早已不新鮮。那麼,這些前沿新科技遇到嚴肅謹慎的金融業,究竟是 黑科技 般的存在,還是技術宅們的另一場狂歡呢?以...