VoIP Push 在海外音視訊業務中的應用

融雲RongCloud發表於2022-07-06

VoIP(Voice over Internet Protocol)也被稱為 IP 電話,通過 IP 協議傳輸語音通訊和多媒體會話,是一種價效比高且體系架構開放的技術方案,可以被應用在相親、面試、諮詢等多種場景,提供優異的通訊體驗。而 VoIP Push 是 VoIP 應用實現流程上非常重要的一環。關注【融雲全球網際網路通訊雲】瞭解更多

在音視訊業務出海過程中,iOS 端 PushKit 與 CallKit 框架配合,提供與手機系統一樣的來電體驗,直接在鎖屏介面顯示,並且通話過程中不會被其他應用打斷。(由於受蘋果稽核政策的影響,CallKit 在內地不可用。)

6 月 23 日的融雲 RTC · 進階實戰高手課上,融雲音視訊研發工程師從 VoIP 概念、VoIP Push 在不同平臺的實現過程等方面介紹了在 VoIP Push 海外專案中的應用,並重點分享了其在 iOS 端的實踐。後臺回覆【VoIP】獲取完整課件


什麼是 VoIP?

傳統的語音通訊使用的是基於電路交換的 PSTN,特點是連續路徑採用物理連線,電路接通後,出現在資料終端使用者面前的電路就好像專線一樣,交換機控制電路不會去檢視傳輸的資料包中的任何內容,為使用者提供了一條完全透明的通訊通路。

(傳統通訊採用電路交換技術,圖源:Nextiva)

電路交換技術為使用者的每一個呼叫建立一個連線技術,而連線一旦建立,就一直被一對使用者固定佔用,無論他們是否通訊,都不能被其他使用者共享。當通訊較少時,資訊傳輸的實際效率降低,且由於其通訊時電路被使用者獨佔,通訊成本較高。

VoIP(Voice over Internet Protocol,也稱為 IP 電話)是一種通過 Internet 網路協議傳送語音通訊和多媒體會話的技術。

VoIP 技術採用了分組交換技術作為通訊平臺。

(VoIP 採用分組交換技術,圖源:Nextiva)

分組交換技術採用了報文交換的“儲存-轉發”方式,但不像報文交換機那樣以報文作為單位進行交換,而是把報文截成較短的、統一格式的分組來進行交換和傳輸。每一個分組進入交換機後,交換機依據分組中的地址資訊選擇該分組的傳輸路徑,並將其沿著選定的路徑傳輸給下一個交換機或使用者終端。

同電路交換機技術相比較,分組交換由於不存在專用鏈路,其通訊通路的利用率很高。可以說,IP 骨幹網中的每條線路都在為所有使用者提供傳輸服務。

運營商在架設 PSTN 的終端時有很大的硬體設施上的成本投入,如通訊電纜、資料交換裝置、各節點裝置、施工成本、人工成本、維護成本等。而 VoIP 全是基於 Internet 上的傳輸,充分利用了使用者的寬頻資源,價效比更高。加上專門的終端接入裝置及相應的平臺技術對語音的強大處理功能,VoIP 的通話質量能達到傳統的 IP 電話的通話質量。

綜上所述,VoIP 與傳統電話相比優勢在於:
① 能夠更加有效地使用網路資源
② 價效比高
③ IP 電話網繼承了計算機網路的智慧特性,可以靈活地實現各種增值業務的開發
④ 開放的體系結構


VoIP Push 在不同平臺的實現

VoIP Push 是 VoIP 應用實現流程上非常重要的一環。而它的實現在不同平臺各有特點。

PC 端

PC 端目前與移動的差異是在於 PC 端的 App 一直處於實時線上狀態。可以通過融雲 IMLib 下發來電進行響應和展示。

(PC 端呼叫流程)

與 PC 端不同,移動端使用者可以“殺死”App,就需要一種訊息觸達的手段。

Android 端

這裡就需要用到 FCM 服務了。
FCM (Firebase Cloud Messaging) 是一種基於 Google Play Services 構建的跨平臺服務,用於處理伺服器應用程式和移動客戶端應用之間的訊息的傳送、路由和排隊。

如下圖,FCM 充當訊息發件人和客戶端之間的中介。客戶端應用啟用 FCM,可在裝置上執行。

(FCM 服務流程)

具體到融雲 CallLib 呼叫解決方案中,流程如下圖所示:

(融雲 CallLib 呼叫流程)

FCM 服務收到一個來電的 Push 訊息,然後 App 會被系統拉活。App 拉起後會去連結 IM 服務,IM 服務連結成功後,客戶端便會收到一條來電的信令。

融雲 CallLib 會對來電信令進行處理,然後呼叫系統的 Telecom 框架建立一個來電,App 需要註冊一個 ConnectionService 用來接收系統建立來電的回撥。

然後,ConnectionService 會真正建立一個 Connection 物件來處理一個新的來電,在 Connection 中我們可以拉起業務模組提供的呼入頁面進行展示。

iOS 端

iOS 端的獨特之處在於,蘋果引入了支援 VoIP 推送的 PushKit,且必須配合蘋果 CallKit 框架使用,否則 iOS 系統將在收到 VoIP 推送後暫時“殺掉”App 程式。

CallKit 提供了統一的語音通話 UI 及與該 UI 互動的 API,讓 App 通話可以像 iOS 原生電話來電一樣展現全屏來電及接聽介面;VoIP App 與系統 Call 有著相同的通話優先順序別,而且在通訊錄中的撥號記錄、Siri 喚起、勿擾模式等都可以得到很好的支援。

下面的對比圖可以更清晰地看出其體驗優勢,左側是通過普通推送收到的來電提醒,使用者想要接聽電話需要點選通知並解鎖螢幕進入到應用內。

右側是通過 CallKit 實現來電響應,使用者可以在鎖屏或非鎖屏狀態下直接接聽或拒絕來電,獲得與系統電話一致的體驗。


VoIP Push 和普通推送都是基於 APNs 的。

具體流程上,使用者伺服器決定要向使用者傳送哪些通知,以及何時傳送。

當需要傳送通知時,使用者伺服器生成一個請求,其中包含通知資料和使用者裝置的唯一識別符號。然後將請求轉發給 APNs,後者負責將通知傳送到使用者的裝置。收到通知後,使用者裝置上的作業系統會處理任何使用者互動並將通知傳遞給應用程式。

(VoIP Push 流程)

在以前,VoIP 應用必須與伺服器保持持久的網路連線才能接收來電和其他資料。

這意味著需要編寫複雜的程式碼,在應用程式和伺服器之間來回傳送定期訊息,以保持連線處於活動狀態,即使在應用程式未使用時也是如此。這種技術會導致裝置頻繁被喚醒,浪費資源。這也意味著如果使用者退出 VoIP 應用,將無法再接收來自伺服器的呼叫。

而使用 PushKit 框架——允許應用程式從遠端伺服器接收推送。每當收到推送時,應用程式就會被喚醒。

PushKit 具有以下特性:
① 僅當 VoIP 推送發生時裝置才會被喚醒,節省能源。
② 與標準推送通知不同,VoIP 推送直接進入到 App 內部進行處理。
③ VoIP 推送被認為是高優先順序通知,並且會立即傳送。
④ VoIP 推送可以包含比標準推送更多的資料內容,用於處理業務邏輯。
⑤ App 在收到 VoIP 推送時未執行,則會自動拉活 App。需要注意的是,我們要合理使用 PushKit,否則 PushKit 會被系統判定為非法啟用,導致 PushKit 無法使用。
⑥ 即使 App 在後臺執行,App 也有一定時間來處理推送。

與其搭配使用的 CallKit 具有以下特性:
① 允許使用者在 VoIP App 中通過連結直接在蘋果電話中發起呼叫。
② 系統功能整合,例如勿打模式、靜音或振動模式等。
③ 呼叫阻止功能,首先將傳送者的應用內號碼與接收者的 iPhone 使用者阻止列表匹配。允許應用程式插入一個自定義的被阻止號碼列表。
④ 識別來電者,從儲存的聯絡人列表中顯示他的姓名。此功能在社交網路中特別有用,暱稱與通訊錄中的名稱可以是不同的。


PushKit+CallKit 的實現

首先要在 Apple 開發者中心建立 VoIP 證書,其次要在 XCode 中配置 VoIP 功能生效。

程式碼中,我們首先要註冊並實現 PushKit 相關程式碼,包括通過 PushRegistry 初始化,註冊 VoIP Push Token 並上傳到服務端和響應來電等。

CallKit 的架構圖


如上 CallKit 的架構圖所示,VoIP 應用程式和其他系統服務,比如藍芽、Siri、電話等都包含 CallKit,可以通過與系統通訊互相響應啟用。

在實現 CallKit 的應用程式中,需要引入兩個 CallKit 核心類。

CXProvider 類和 CXCallController 類。

CXProvider:應用程式將用於讓系統知道任何傳入/傳出呼叫。

CXCallController:應用程式將用於讓系統瞭解任何本地使用者操作。
CXProviderConfiguration 提供了一些我們可以自定義的內容,包括自定義名稱、視訊功能支援、應用圖示以及鈴聲

接聽電話流程


① 當使用者接聽電話時,系統會向 CXProvider 傳送一個 CXAnswerCallAction 例項。
② 應用通過實現 CXProviderDelegate 方法來響應使用者的接聽行為。

來電呼入流程


① 為了響應來電,應用通過構造一個 CXCallUpdate 並使用 CXProvider 將其傳送到 iOS 系統。
② iOS 系統將此作為一個呼入,同步到其他所有系統服務。

一般的音視訊專案,通常都需要對 AVAudioSession 進行配置。在什麼時機去配置 AVAudioSession 呢?

如上圖,這是當使用者接聽電話後,系統呼叫 CXProviderDelegate 提供的一個響應接聽方法。在該方法的實現中,配置一個 AVAudioSession 並在完成時呼叫 Action 物件上的 Fulfill 方法。

結束電話流程


① 首先使用者在 UI 上點選了通話結束,Callkit 中獲取對通話的引用。
② 由於通話即將結束,所以要停止處理通話的音訊。
③ 呼叫 End 方法改變狀態,允許其他系統服務對新狀態做出反應。
④ 此時,呼叫 Fullfill 標記為已完成,系統會將其結束掉。

相關文章