Я пытался создать приложение VoIP, используя callkit и pushkit.Когда вызывающий абонент нажимает кнопку вызова, получатель получает экран входящего вызова с pushkit, и вызывающий абонент переходит к экрану вызова и ожидает ответа получателя.
Что мне нужно, когда вызывающий абонент отменил вызов, экран пользователя получателя необходимо закрыть перед ответом или отклонением.Но когда получатель нажимает кнопку «Ответить» или «Отклонить», зеленая полоса в верхней части экрана вызывающего абонента не отвечает на запрос «Вернуться к вызову».Но он должен запустить таймер или автоматически закрыться в соответствии с ответом получателя.
Это моя функция отправки вызова.(Глобальная переменная моего провайдера)
_provider = CXProvider(configuration: CXProviderConfiguration(localizedName: "app"))
_provider.setDelegate(self, queue: nil)
let controller = CXCallController()
let transaction = CXTransaction(action: CXStartCallAction(call: uuid, handle: CXHandle(type: .generic, value: "Pete Za")))
controller.request(transaction, completion: { error in })
let vc = CallRoomViewController()
vc.modalPresentationStyle = .overFullScreen
vc.modalTransitionStyle = .crossDissolve
self.present(vc, animated: true)
Моя функция pushRegistry AppDelegate.
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
print("PushType: \(type)")
print("---PushPayload---")
let json = payload.dictionaryPayload as NSDictionary
print(payload.dictionaryPayload as NSDictionary)
let aps = json["aps"] as! NSDictionary
let callerId = aps["callerId"] as! String
let callerImg = aps["callerImg"] as! String
let callerName = aps["callerName"] as! String
let receiverId = aps["receiverId"] as! String
let receiverImg = aps["receiverImg"] as! String
let receiverName = aps["receiverName"] as! String
let roomNo = aps["roomNo"] as! String
let token = aps["token"] as! String
let uuidstr = aps["uuid"] as! String
let uuid = UUID(uuidString: uuidstr) as! UUID
let config = CXProviderConfiguration(localizedName: "app")
config.iconTemplateImageData = UIImagePNGRepresentation(UIImage(named: "speaker")!)
config.ringtoneSound = "ringing.mp3"
config.supportsVideo = false;
_provider = CXProvider(configuration: config)
_provider.setDelegate(self, queue: nil)
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: callerName)
update.hasVideo = false
_provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in })
}
методы делегата провайдера:
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
action.fulfill()
let vc = CallRoomViewController()
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
}
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
action.fulfill()
}