Swift

Entgegennahme eines Anrufs

Nachdem die Aufrufschnittstelle erstellt wurde, können Sie nun den für den Empfang eines Anrufs erforderlichen Code hinzufügen. Die VGVoiceClientDelegate hat eine Funktion, die aufgerufen wird, wenn eine Einladung zum Anruf eingeht. Beginnen Sie damit, den Delegierten des Klienten in der Datei CallViewController's viewDidLoad Funktion:

self.client.delegate = self

Dann, am Ende der CallViewController.swift Datei fügen Sie die Konformität mit der 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)
    }
}

Wenn ein Anruf eingeht, werden Sie eingeladen, didReceiveInviteForCall aufgerufen werden. Wenn der Angerufene den Anruf beendet, didReceiveHangupForCall angerufen werden. Wenn die Einladung zum Anruf aufgehoben wird, didReceiveInviteCancelForCall aufgerufen werden.

Als nächstes erstellen Sie die displayIncomingCallAlert Funktion in der CallViewController Klasse:

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

Die displayIncomingCallAlert Funktion nimmt als Parameter eine Anruf-ID und einen Anrufer an. Beachten Sie in der UIAlertAction für die Beantwortung der Einladung, bei Erfolg weisen Sie die callID zu der Eigenschaft von vorhin hinzufügen, und die Auflegen-Taste wird sichtbar sein. Fügen Sie die Funktion zum Beenden von Anrufen der Eigenschaft CallViewController Klasse:

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

Im nächsten Schritt fügen Sie den für einen Anruf erforderlichen Code hinzu.