CallKit的功能介紹
CallKit可以幫我們的網(wǎng)絡電話提供怎樣更好的體驗?
鎖屏時,有一個來電,現(xiàn)在是這樣的

就是一條普通的推送信息,看起來和iMessage的一條信息沒有什么區(qū)別。
沒有鎖屏時,如下,都是需要點擊后進入應用內再進行操作。

CallKit會帶來怎樣的改變呢,我們可以看下,
鎖屏時,有一個來電

非鎖屏時,有來電

接聽后

讓你的網(wǎng)絡電話有類似iphone自帶電話的體驗,確實很cool
而且call kit還可以讓你的在線電話應用和系統(tǒng)電話,F(xiàn)aceTime音頻通話,甚至是其他網(wǎng)絡電話相互作用

從系統(tǒng)通訊錄,通話記錄中打開你的電話應用

通過Siri,藍牙調起你的電話應用撥打電話。系統(tǒng)的免打擾設置對你的應用也是有效的。這就是CallKit。
CallKit的類和分工

CallKit有兩個主要的類CXProvider和CXCallController
CXProvider可以將一些外來事件通知給系統(tǒng)

CXCallController可以讓系統(tǒng)收到App的一些Request,用戶的action,內部的事件。還可以完成上面說的與其他的電話應用進行交互的操作。

Provider想要和系統(tǒng)交互,通過CXCallUpdate來傳遞信息

系統(tǒng)想要Provider知道用戶進行那種操作,通過CXAction來傳遞信息

controller想要系統(tǒng)知道用戶進行了什么操作,通過CXTransaction承載信息

Incoming Call的Demo
先看一下接電話的例子

Demo中有兩個比較關鍵的類SpeakerboxCallManager和SpeakerboxCall
SpeakerboxCallManager是通話的管理類,可以完成撥打電話,掛斷電話等功能。
SpeakerboxCall是通話的Model類,保存通話的一些信息。
我們新創(chuàng)建一個ProviderDelegate,它實現(xiàn)了CXProviderDelegate。

初始化方法中,創(chuàng)建了CXProvider對象,設置了Delegate,如果沒有用戶授權的話,請求用戶授權。

可以看到初始化CXProvider對象時還會進行一些配置,包括通話中UI上顯示的應用的名字,是否支持視頻,應用的icon。代碼中配置每組中最多有一個通話,也就是不會出現(xiàn)同時接聽兩個以上通話的情況。

下面看下當一個電話打進來的時候,我們應該怎樣處理
首先,我們會接到推送通知

如果是voip類型的推送,我們可以解析到UUID(通話的唯一標識),handle(誰打的電話)
調用ProviderDelegate的方法,通知系統(tǒng)顯示Incoming Call的全屏UI,

注意CXProvider通知系統(tǒng)來電話了,是通過CXCallUpdate傳遞的信息。
實際代碼效果

當用戶點擊接聽,我們還需要對CXProviderDelegate的代理方法進行處理

可以看到系統(tǒng)反饋的用戶操作是CXAnswerCallAction,它是CXAction的一種。
CXAction有兩種狀態(tài),出錯調用fail(),成功調用fulfill()。這個操作是必須的,系統(tǒng)才能正確處理UI的顯示和進行通話狀態(tài)的控制。

當接聽用戶需要掛斷電話的時候,同樣是處理代理方法

這里還需要強調一點,在call的處理過程中,開發(fā)者還需要管理好AudioSession,具體可以參看Demo源碼。
Outgoing Call的Demo
撥打電話的處理起來會稍微復雜一點,先看下生命周期示意圖

我們看下SpeakerboxCallManager中撥打電話的實現(xiàn)


撥打電話的時候我們會生成一個CXTransaction,它包含一組CXAction,Demo中是CXStartCallAction。
調用CXCallController對象的request方法,請求Start Call。
當系統(tǒng)接受request,進入start call狀態(tài)后,會通過CXProviderDelegate的代理方法通知App,也就是Demo中的ProviderDelegate。

代碼中會執(zhí)行App撥打電話的邏輯,并且設置connecting和connected的回調block,這樣才能保證call的生命周期處理,讓CXProvider正確的更新狀態(tài)。
如果支持通過Siri或者電話通訊錄等喚醒你的應用,進行撥打電話的操作,實現(xiàn)AppDelegate的方法。

實際效果如下


連接成功后

我們回到桌面,應用進入后臺

可以看到系統(tǒng)上方會顯示通話中的提示。點擊后可以回到應用。
總結
CallKit到目前為止只提供了講解視頻,沒提供編程指南,更多更復雜的功能可能需要等待具體的文檔來了解了,比如同時有多個通話處理等。