應用出海,如何使用蘋果 CallKit 提升網路通話體驗

融雲RongCloud發表於2021-10-19

【關注 融雲全球網際網路通訊雲】2016 年,蘋果 iOS10 釋出了 CallKit 框架,使第三方 VoIP 型別語音通話類 APP,可以擁有與手機系統一樣的來電體驗——直接顯示在鎖屏介面,並且通話過程中,APP 的音視訊許可權和運營商電話一樣,不會被其他應用打斷。如何實現?

2018 年,蘋果 APP 稽核中心通過郵件告知開發者:在中國大陸地區上架的 APP 不可使用 Callkit。

並且,從 iOS13 開始,基於安全形度考慮,蘋果要求在使用 VoIP 推送時必須配合 CallKit 框架使用,否則 iOS 系統將在收到 VoIP 推送後殺掉 APP 程式,就像沒有收到 VoIP 推送一樣。

蘋果 CallKit 框架無法在國內上架使用,我們也就無法在國內使用 VoIP 推送功能在手機後臺喚醒息屏了的 APP。

但是,對於在沒有上架限制地區投放的應用,蘋果 CallKit 依然是提升使用者使用體驗的重要手段。

當下,出海浪潮浩浩蕩蕩,融雲作為佈局全球的通訊雲服務商,為全球開發者提供安全、可靠的網際網路通訊雲服務。上架海外應用商店的 APP,在使用融雲 SDK 獲得穩定通訊能力後整合蘋果 CallKit,可以大幅提高使用者體驗和使用便捷性。

本文分享通過蘋果 CallKit 框架實現來電、接聽、結束通話、呼叫等通話場景的流程。

蘋果 CallKit 效果

在 iPhone 鎖屏狀態下 APP 來電時,通過蘋果 CallKit 可以像 iOS 原生電話來電一樣展現全屏的來電及接聽介面,VoIP APP 與系統 Call 有著相同的通話優先順序別,而且在通訊錄中的拔號記錄、Siri 喚起、勿擾模式等都可以得到很好的支援。


(蘋果 CallKit 框架下的 APP 來電介面)


(蘋果 CallKit 框架下的 APP 接聽介面)

下圖簡略描述了原生 APP、第三方 APP 在 CallKit 框架下的關係。CallKit 在系統中提供了一種獨有的服務,在需要的時刻,原生或者第三方 APP 通過 CallKit 提供的 API 向系統請求諸如來電、拔出等展現服務,由 Call Service 統一安排排程這些請求以達成統一的互動響應。


(原生和第三方 APP 在 CallKit 框架下的關係)

如何使用蘋果 CallKit

蘋果 CallKit 提供了統一的語音通話 UI 及與該 UI 互動的 API,但實際的通話鏈路監聽、搭建和管理還需要沿用 APP 原有的實現思路。下面,我們分享來電、拔出等場景下 APP 與 CallKit 的互動流程。

Prepare

① 建立 CXProvider,指定 CallKit 展現 UI 中的 APP 名稱和圖示、通話數量、來電鈴聲等 Configuration

② 實現 CXProviderDelegate 協議,以接收來自 Call Service 發來的更新狀態,例如使用者點選了接聽或者結束通話等動作,決定網路鏈路的處理動作;還有 AudioSession 的啟用狀態,決定 Audio 播放錄製的啟動關閉時機

③ 建立 CXCallController,使 APP 可以傳送更新狀態給 Call Service,例如使用者拔出電話或者對方結束通話電話等狀態

④ 如果需鎖屏介面及 APP 未啟動狀態下顯示來電介面,要搭建 PushKit 通路,與 APNS 差不多,只是 APP 端處理方式有些不同。


(準備工作)

Incoming Call

① APP 前臺時收到來自網路 Server 端的連線請求,或者 APP 後臺時收到來自網路 Push Server 的 PushEvent

② APP 收到連線請求或者 Push 訊息後,建立 CXCallUpdate 物件,指定此次來電的號碼等屬性

③ 將上面建立的 CXCallUpdate 物件通過 CXProvider 的 reportNewIncomingCall WithUUID 方法報告給 iOS 系統

④ Call Service 收到新的來電請求後根據當前的狀態,展現原生來電 UI


(來電場景實現流程)

Answer Call

① 使用者點選來電介面上的接聽按鈕

② Call Service 通過 CXProvider 的 Delegate 協議 performAnswerCallAction 方法告知 APP

③ APP 將接聽命令通過網路傳給對端,開始實際音訊資料傳輸,進行通話


(接聽場景實現流程)

End Call

① 使用者點選 APP UI 中的結束通話按鈕

② 建立 CXEndCallAction 物件,指定此次通話的 UUID 屬性

③ 建立 CXTransaction,將 Action 指定給它

④ 通過 CXCallController,呼叫 request Transaction 將這個結束通話事件通知給 Call Service

⑤ Call Service 通過當前通話狀態,通過 CXProvider 將結束通話動作通知回給 APP

⑥ 在 CXProviderDelegate 中的 performEnd CallAction 中結束此次通話的網路鏈路,停止音訊錄製播放 Loop


(結束通話場景實現流程)

Outgoing Call

① 使用者通過 APP UI、通話錄、Siri 發起一個拔出請求

② 建立 CXHandle 指定撥出的電話號碼,建立 CXStartCallAction 並將 CXHandle 指定給它

③ 建立 CXTransaction,將剛剛的 Action 指定給它

④ 通過 CXCallController 呼叫 request Transaction,將這個拔出事件通知給 Call Service

⑤ Call Service 收到新的撥出請求後根據當前的狀態,通過 CXProvider 將撥出動作通知回 APP

⑥ 在 CXProviderDelegate 中的 perform StartCallAction 中開啟此次呼叫的網路鏈路,通過 CXProvider 的 reportOutgoing CallWithUUID 設定呼叫與接通時間,根據鏈路建立的結果來展現原生呼叫 UI 的狀態(呼叫成功或者失敗)


(撥出場景實現流程)

蘋果 CallKit 開發框架,賦予語音或視訊通話應用的開發者諸多便利——

允許開發者將 UI 介面整合在 iPhone 原生的電話 APP 中;

允許開發者將通訊 APP 的功能內建在電話 APP 的“常用聯絡資訊”以及“通話記錄”,方便使用者透過原生電話 APP,直接取用這些第三方功能;

允許使用者在通知中心直接瀏覽並回復來電,來電的畫面也將整合在 iOS 原生的 UI 裡。

總而言之,蘋果 CallKit 讓 iOS 原本單純用來打電信電話的“電話”功能,能夠結合眾多第三方語音通訊軟體,具備更完整的數碼電話能力。而對融雲服務的廣大出海開發者來說,整合蘋果 CallKit,應用內的 VOIP 通話可以獲得系統級的通話效果,極大地提升使用者使用體驗。

相關文章