Recibir una llamada
Ahora que la interfaz de llamada está construida, puedes añadir el código necesario para recibir una llamada. La dirección VGVoiceClientDelegate tiene una función que se llama cuando hay una invitación de llamada entrante. Comience por establecer el delegado del cliente en la función CallViewController's viewDidLoad función:
self.client.delegate = self
Luego, al final de la CallViewController.swift añada la conformidad al archivo VGVoiceClientDelegate.
extension CallViewController: VGVoiceClientDelegate {
func voiceClient(_ client: VGVoiceClient, didReceiveInviteForCall callId: String, from caller: String, withChannelType type: VGVoiceChannelType) {
DispatchQueue.main.async { [weak self] in
self?.displayIncomingCallAlert(callID: callId, caller: caller)
}
}
func voiceClient(_ client: VGVoiceClient, didReceiveInviteCancelForCall callId: String, with reason: VGVoiceInviteCancelReason) {
DispatchQueue.main.async { [weak self] in
self?.dismiss(animated: true)
}
}
func voiceClient(_ client: VGVoiceClient, didReceiveHangupForCall callId: String, withQuality callQuality: VGRTCQuality, reason: VGHangupReason) {
self.callID = nil
self.setHangUpButtonHidden(true)
self.setStatusLabelText("Ready to receive call...")
}
func client(_ client: VGBaseClient, didReceiveSessionErrorWith reason: VGSessionErrorReason) {
let reasonString: String!
switch reason {
case .tokenExpired:
reasonString = "Expired Token"
case .pingTimeout, .transportClosed:
reasonString = "Network Error"
default:
reasonString = "Unknown"
}
self.setStatusLabelText(reasonString)
}
}
Cuando hay una invitación de llamada entrante, didReceiveInviteForCall será llamada. Si el receptor finaliza la llamada, didReceiveHangupForCall será llamado. Si se cancela la invitación de llamada, didReceiveInviteCancelForCall se llamará.
A continuación, cree el displayIncomingCallAlert en la función CallViewController clase:
func displayIncomingCallAlert(callID: String, caller: String) {
let alert = UIAlertController(title: "Incoming call from", message: caller, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Answer", style: .default, handler: { _ in
self.client.answer(callID) { error in
if error == nil {
self.setHangUpButtonHidden(false)
self.setStatusLabelText("On a call with \(caller)")
self.callID = callID
} else {
self.setStatusLabelText(error?.localizedDescription)
}
}
}))
alert.addAction(UIAlertAction(title: "Reject", style: .destructive, handler: { _ in
self.client.reject(callID) { error in
if let error {
self.setStatusLabelText(error.localizedDescription)
}
}
}))
self.present(alert, animated: true, completion: nil)
}
En displayIncomingCallAlert toma como parámetros un identificador de llamada y un llamante. Tenga en cuenta que en la función UIAlertAction por responder a la invitación, si tiene éxito asignará el callID a la propiedad de antes y el botón de colgar será visible. Añade la función para finalizar llamadas a la propiedad CallViewController clase:
@objc private func endCall() {
guard let callID else { return }
client.hangup(callID) { error in
if error == nil {
self.callID = nil
self.setHangUpButtonHidden(true)
self.setStatusLabelText("Ready to receive call...")
}
}
}
En el siguiente paso añadirás el código necesario para realizar una llamada.
Hacer una llamada de voz de aplicación a aplicación
Realizas una llamada de voz desde una aplicación iOS a otra aplicación iOS