天天看點

Swift : 在VoIP應用中接入iOS10中的CallKit架構--即接聽電話使用系統原生界面

        由于目前開發的應用是一款VoIP應用,需要接入iOS10新架構CallKit,由于這個架構在官網也隻有各種方法,沒有具體的說明,不過提供了一個swift版本的Demo作為參考,

官網Demo連結位址:官網Demo連結

          使用CallKit接聽來電的步驟為:

1、配置CallKit架構的模型類、管理類和代理方法類,這個可以參考官網Demo裡面的,需要的檔案見下圖紅線标注的部分

Swift : 在VoIP應用中接入iOS10中的CallKit架構--即接聽電話使用系統原生界面

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

繼續閱讀