Criação da interface de chamada
Para poder fazer a chamada, você precisará criar um novo View Controller para a interface de chamada. No menu do Xcode, selecione File > New > File.... Escolha um Classe Cocoa Touch, é só dizer CallViewController com uma subclasse de UIViewController e idioma de Swift.

Isso criará um novo arquivo chamado CallViewController, na importação principal VonageClientSDKVoice.
import UIKit
import VonageClientSDKVoice
A interface de chamada precisará de:
- A
UIButtonpara iniciar uma chamada - A
UIButtonpara encerrar uma ligação - A
UILabelpara exibir atualizações de status
Abrir CallViewController.swift e adicioná-lo programaticamente.
class CallViewController: UIViewController {
let callButton = UIButton(type: .system)
let hangUpButton = UIButton(type: .system)
let statusLabel = UILabel()
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
callButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(callButton)
hangUpButton.setTitle("Hang up", for: .normal)
hangUpButton.translatesAutoresizingMaskIntoConstraints = false
setHangUpButtonHidden(true)
view.addSubview(hangUpButton)
setStatusLabelText("Ready to receive call...")
statusLabel.textAlignment = .center
statusLabel.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(statusLabel)
NSLayoutConstraint.activate([
callButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
callButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
callButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
callButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
hangUpButton.topAnchor.constraint(equalTo: callButton.bottomAnchor, constant: 20),
hangUpButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
hangUpButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
hangUpButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
statusLabel.topAnchor.constraint(equalTo: hangUpButton.bottomAnchor, constant: 20),
statusLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
statusLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
statusLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)
])
}
private func setHangUpButtonHidden(_ isHidden: Bool) {
DispatchQueue.main.async { [weak self] in
guard let self else { return }
self.hangUpButton.isHidden = isHidden
self.callButton.isHidden = !self.hangUpButton.isHidden
}
}
private func setStatusLabelText(_ text: String?) {
DispatchQueue.main.async { [weak self] in
guard let self else { return }
self.statusLabel.text = text
}
}
}
Existem duas funções auxiliares setHangUpButtonHidden e setStatusLabelText para evitar a repetição de chamadas DispatchQueue.main.async já que a alteração do estado dos elementos da interface do usuário precisa ser feita na thread principal, conforme exigido por UIKit. O setHangUpButtonHidden A função alterna a visibilidade do hangUpButton já que isso só precisa ficar visível durante uma chamada ativa.
Apresentamos o CallViewController
Agora que a interface de chamada está pronta, você precisará exibir o controlador de visualização a partir da tela de login que criou anteriormente. Você precisará de informações sobre o usuário conectado e de um objeto cliente autenticado para serem passados entre os dois controladores de visualização, em CallViewController.swift adicione o seguinte.
class CallViewController: UIViewController {
...
let user: User
let client: VGVoiceClient
var callID: String?
init(user: User, client: VGVoiceClient) {
self.user = user
self.client = client
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
...
Isso define um inicializador personalizado para a classe, que possui um User.type e VGVoiceClient.type como seus parâmetros, que são então armazenados no local user e client propriedades. Agora que você tem as informações do usuário, pode usar o callButton para mostrar para quem o usuário vai ligar, em viewDidLoad adicione o seguinte.
navigationItem.leftBarButtonItem = UIBarButtonItem(
title: "Logout",
style: .done,
target: self,
action: #selector(self.logout)
)
callButton.setTitle("Call \(user.callPartnerName)", for: .normal)
Ele define o título do controlador de visualização e cria um botão de logout na barra de navegação. Adicione o código correspondente logout função até o final de CallViewController.swift
class CallViewController: UIViewController {
...
@objc func logout() {
client.deleteSession { error in
if error == nil {
DispatchQueue.main.async { [weak self] in
self?.dismiss(animated: true, completion: nil)
}
}
}
}
...
}
Agora você está pronto para apresentar a interface de chamada juntamente com as informações do usuário. Para isso, você precisará editar o login função no ViewController.swift arquivo.
func login() {
guard let user = self.user else { return }
let config = VGClientConfig(region: .US)
config.enableWebsocketInvites = true
client.setConfig(config)
client.createSession(user.jwt) { error, sessionId in
DispatchQueue.main.async { [weak self] in
guard let self else { return }
if error == nil {
let navigationController = UINavigationController(rootViewController: CallViewController(user: user, client: self.client))
navigationController.modalPresentationStyle = .overFullScreen
self.present(navigationController, animated: true, completion: nil)
} else {
self.connectionStatusLabel.text = error?.localizedDescription
}
}
}
}
Se o usuário se conectar com sucesso a um CallViewController serão apresentados os dados do usuário necessários.
Compilar e executar
Execute o projeto novamente (Cmd + R) para executá-lo no simulador. Se você fizer login com um dos usuários, verá a interface de chamada

Fazendo uma chamada de voz de aplicativo para aplicativo
Você faz uma chamada de voz de um aplicativo iOS para outro aplicativo iOS