Я использую следующий код для проверки CallKit. Я могу вызвать исходящий вызов с устройства «A» и, используя VoIP, получить UUID, вызвать функцию входа на устройстве «B». Но когда я нажимаю кнопку ответа на вызов «B», звук («A» и «B») не возникает. Я не получаю никакого обратного вызова делегата на «А», чтобы узнать другую сторону о каком-либо действии.
Как я могу узнать, что состояние обратного вызова устройства «B» означает ответ, отклонение, удержание или завершение вызова на устройстве «A»?
Используется ли метод VoIP для уведомления устройства "A" или я пропускаю шаг?
Файл ProviderDelegate.swift
import Foundation
import CallKit
class ProviderDelegate: NSObject, CXProviderDelegate {
static let sharedInstance = ProviderDelegate()
var provider: CXProvider!
var controller: CXCallController!
override init() {
controller = CXCallController()
let providerConfiguration = CXProviderConfiguration(localizedName: "My App name")
providerConfiguration.supportsVideo = true
providerConfiguration.maximumCallsPerCallGroup = 1
providerConfiguration.supportedHandleTypes = [.generic]
provider = CXProvider(configuration: providerConfiguration)
super.init()
provider.setDelegate(self, queue: nil)
}
func incomingCall(uuid: UUID) {
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: "Any name")
provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in })
}
func outgoingCall(uuid: UUID) {
let transaction = CXTransaction(action: CXStartCallAction(call: uuid, handle: CXHandle(type: .generic, value: "Any name")))
controller.request(transaction, completion: { error in })
}
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
print ("CXAnswerCallAction")
configureAudioSession()
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
print ("CXEndCallAction")
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
print ("CXSetHeldCallAction")
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
print ("CXStartCallAction")
configureAudioSession()
provider.reportOutgoingCall(with: action.uuid, startedConnectingAt: nil)
provider.reportOutgoingCall(with: action.uuid, connectedAt: nil)
action.fulfill()
}
func providerDidReset(_ provider: CXProvider) {
print ("Distory")
}
}
Файл Audio.swift
import Foundation
import AVFoundation
func configureAudioSession() {
print("Configuring audio session")
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.setMode(AVAudioSessionModeVoiceChat)
try session.setActive(true)
}
catch (let error) {
print("Error while configuring audio session: \(error)")
}
}
func startAudio() {
print("Starting audio")
}
func stopAudio() {
print("Stopping audio")
}
Редактировать
Используйте Apple VOIP для отправки и получения UUID
Файл AppDelegate.swift
let providerDelegate = ProviderDelegate.sharedInstance
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
let payloadDict = payload.dictionaryPayload["aps"] as! NSDictionary
let uuid = payloadDict.object(forKey: "uuid") as! String
providerDelegate.incomingCall(uuid: UUID.init(uuidString: uuid)!)
}