Swift

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.