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.
Fazendo uma chamada de voz de aplicativo para aplicativo
Você faz uma chamada de voz de um aplicativo iOS para outro aplicativo iOS