Swift

Receber uma ligação

Agora que a interface de chamada já está pronta, você pode adicionar o código necessário para receber uma chamada. O VGVoiceClientDelegate possui uma função que é chamada quando há um convite de chamada recebida. Comece definindo o delegado do cliente no CallViewController's viewDidLoad função:

self.client.delegate = self

Então, no final do CallViewController.swift adicionar a conformidade ao arquivo 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)
    }
}

Quando há um convite para uma chamada recebida, didReceiveInviteForCall será chamada. Se o destinatário encerrar a chamada, didReceiveHangupForCall será realizada. Se o convite para a chamada for cancelado, didReceiveInviteCancelForCall será chamado.

Em seguida, crie o displayIncomingCallAlert função no CallViewController classe:

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)
}

O displayIncomingCallAlert A função recebe um ID de chamada e um autor da chamada como parâmetros. Observe que no UIAlertAction por responder ao convite; caso seja aprovado, você designará o callID à propriedade definida anteriormente, e o botão para desligar ficará visível. Adicione a função para encerrar chamadas ao CallViewController classe:

@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...")
        }
    }
}  

Na próxima etapa, você adicionará o código necessário para fazer uma chamada.