由于目前開發的應用是一款VoIP應用,需要接入iOS10新架構CallKit,由于這個架構在官網也隻有各種方法,沒有具體的說明,不過提供了一個swift版本的Demo作為參考,
官網Demo連結位址:官網Demo連結
使用CallKit接聽來電的步驟為:
1、配置CallKit架構的模型類、管理類和代理方法類,這個可以參考官網Demo裡面的,需要的檔案見下圖紅線标注的部分
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SZ3YmM2EWYlRWYlVGM5UmZmRWOykzY0UGN0YWMhZ2Nx8CXxAzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
2、在AppDelegate中引入PushKit架構,并注冊pushRegistry對象,遵守PKPushRegistryDelegate代理,并實作其
didReceiveIncomingPushWithPayload代理方法,部分代碼如下:
在此還需要定義兩個對象:CallKit管理類和CallKit代理方法類對象
在收到來電推送後,在
didReceiveIncomingPushWithPayload方法中将來電的參數傳給CallKit中的方法報給系統向使用者展示
3、開發中遇到的問題:
(1)當應用在背景且手機未鎖屏時,如何在接通系統界面的同時自動接通應用中的來電界面
解決方法:在CallKit的代理類中的performAnswerCallAction代理方法中向應用的來電界面發送一個通知,應用的來電界面收到通知後,在通知方法中設定按鈕的自動點選事件:
self.acceptBtn.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
(2)當app使用者作為被叫時,如何讓系統界面被動挂斷電話?
解決方法:每個來電都有唯一的callUUID,然後找到這個來電對象,使用CXEndCallAction建立動作,讓界面執行改動做
//找到與uuid相對應的call對象
guard let call = callManager?.callWithUUID(self.callUUID) else {
return
}
let callend : CXEndCallAction = CXEndCallAction(callUUID: call.uuid!)
let transaction : CXTransaction = CXTransaction.init()
transaction.addAction(callend)
callManager?.callController.requestTransaction(transaction, completion: { (error) in
print("-----error : \(error)")
})
參考文檔連結:http://www.jianshu.com/p/d3d82f62ffaa
http://www.jianshu.com/p/3bf73a293535
http://www.jianshu.com/p/305bd923c1ae