Swift

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.

Xcode adding file

Isso criará um novo arquivo chamado CallViewController, na importação principal VonageClientSDKVoice.

import UIKit
import VonageClientSDKVoice

A interface de chamada precisará de:

  • A UIButton para iniciar uma chamada
  • A UIButton para encerrar uma ligação
  • A UILabel para 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

Call interface