Swift

Recibir una llamada

Ahora que ya tienes creada la interfaz de llamada, puedes añadir el código necesario para recibir una llamada. El 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ñade 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 se realizará la llamada. Si el destinatario finaliza la llamada, didReceiveHangupForCall se realizará la llamada. Si se cancela la invitación a la llamada, didReceiveInviteCancelForCall se llamará.

A continuación, cree el displayIncomingCallAlert función en el 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)
}

El displayIncomingCallAlert La función toma como parámetros un ID de llamada y el nombre de la persona que llama. Ten en cuenta que en el UIAlertAction por responder a la invitación, si tiene éxito asignará el callID a la propiedad anterior y aparecerá el botón para colgar. Añade la función para finalizar llamadas al 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.