Guia de migração do Twilio (iOS)
Este guia orienta você na migração do seu aplicativo de vídeo Twilio atual para o Vonage Video.
Para obter o máximo de flexibilidade e versatilidade na programação da sua solução de vídeo, o SDK do iOS para a Video API da Vonage cuida de tudo para você.
Se suas necessidades vão além de simples funções de vídeo e incluem recursos como transmissão, integração com SIP, processamento de mídia e configurações personalizáveis de transmissão, você descobrirá que o SDK do Vonage Video para iOS oferece potência e flexibilidade inigualáveis.
Visão geral
As Video APIs do Twilio e do Vonage têm conceitos muito semelhantes. Este guia introdutório tem como objetivo ajudá-lo a migrar seu aplicativo de vídeo.
Uma diferença fundamental entre a implementação de vídeo do Twilio e do Vonage é o uso de sala SID, isso é um ID da sessão no que diz respeito à Vonage. Vamos ver como gerar um ID de sessão em uma seção posterior.
Você também precisará de um token de autenticação ao conectar um cliente a uma sessão ativa.
O diagrama abaixo ilustra as diferenças arquitetônicas entre o serviço de vídeo do Twilio e o da Vonage.


Mapeamento de terminologia entre Twilio e Vonage
| Twilio | Vonage |
|---|---|
| Room | Session |
| Participants | Subscriber(s) + Publisher(s) |
| Tracks | Stream |
| RemoteTracks | Subscribers(s).stream |
| LocalTracks | Publisher(s).stream |
Obter credenciais do Video SDK
Criar um Account de desenvolvedor para acessar o portal do desenvolvedor.
Para começar a trabalhar com vídeo, você precisa criar uma aplicação. Você pode seguir as criar um aplicativo guia para obter seu ID do aplicativo e chave privada.
Instale o SDK
Você pode instalar o SDK do Vonage Video para iOS por meio do Gerenciador de Pacotes Swift ou Cocoapods:
Usando o Swift Package Manager
Para adicionar uma dependência de pacote ao seu projeto do Xcode, selecione Arquivo > Pacotes Swift > Adicionar dependência de pacote e insira a URL do repositório:
Usando o Cocoapods
Ao adicionar o SDK usando o CocoaPods, edite o arquivo Podfile e adicione a seguinte linha:
Salve as alterações no Podfile, abra o diretório raiz do projeto no terminal/linha de comando e execute:
Isso deve instalar o SDK de vídeo da Vonage e suas dependências.
Agora você pode adicionar o SDK ao seu controlador de visualização.
No Xcode, abra seu ViewController.swift arquivo e, bem no início do arquivo, adicione as seguintes linhas para importar a biblioteca de vídeo:
import UIKit
import OpenTok
Autenticação
O SDK de vídeo da Vonage utiliza tokens para autenticar usuários. Ao gerar um token, é possível definir a função do usuário (assinante, editor ou moderador). Opcionalmente, também é possível atribuir uma sequência de metadados ao token (ou seja, para identificar o cliente conectado).
Consulte nosso Guia de criação de tokens para aprender como gerar tokens. Os tokens são gerados no lado do servidor e, em seguida, utilizados no lado do cliente. Acesse o Guias dos SDKs do lado do servidor para saber mais.
Criar uma sessão de vídeo
A sessão é como um sala. Todos os clientes que utilizam o mesmo ID da sessão poderão se comunicar entre si.
Como fichas, sessões são criados no lado do servidor. Consulte nosso Criação de um guia de sessão para saber mais.
Para criar uma sessão e gerar um token, use uma de nossas SDKs de servidor.
Você pode declarar todas as suas chaves como propriedade no seu ViewController.swift arquivo:
// Replace with your Application ID
var kApplicationId = ""
// Replace with your generated session ID
var kSessionId = ""
// Replace with your generated token
var kToken = ""
Conectar-se a uma sessão de vídeo
Com todas as suas chaves configuradas, agora você pode se conectar a uma sessão de vídeo ativa.
Você precisa fazer isso antes de poder publicar seu stream de áudio e vídeo na sessão ou visualizar os streams dos outros participantes.
Twilio
let twimlParamTo = "to"
let connectOptions: TVOConnectOptions = TVOConnectOptions(accessToken: accessToken) { (builder) in
builder.params = [twimlParamTo : “{to}”]
}
TwilioVoice.connect(with: connectOptions, delegate: self)
Vonage
class ViewController: UIViewController
var session: OTSession?
override func viewDidLoad() {
super.viewDidLoad()
connectToAnOpenTokSession()
}
func connectToAnOpenTokSession() {
// Important: Please note that your Application ID is your API key.
session = OTSession(apiKey: kApplicationId, sessionId: kSessionId, delegate: self)
var error: OTError?
session?.connect(withToken: kToken, error: &error)
if error != nil {
print(error!)
}
}
Ouvintes de eventos
A Vonage e a Twilio disponibilizam protocolos de delegação para ajudar você a manter o estado de uma sessão/chamada para todos os participantes conectados a ela.
Alterações na conexão entre sessão e sala
Twilio
// MARK: TVOCallDelegate
func callDidStartRinging(_ call: TVOCall) {
NSLog("callDidStartRinging:")
}
func callDidConnect(_ call: TVOCall) {
NSLog("callDidConnect:")
}
func call(_ call: TVOCall, isReconnectingWithError error: Error) {
NSLog("call:isReconnectingWithError:")
}
func callDidReconnect(_ call: TVOCall) {
NSLog("callDidReconnect:")
}
func call(_ call: TVOCall, didFailToConnectWithError error: Error) {
NSLog("Call failed to connect: \(error.localizedDescription)")
}
func call(_ call: TVOCall, didDisconnectWithError error: Error?) {
NSLog("Call disconnected")
}
Vonage
// MARK: - OTSessionDelegate callbacks
extension ViewController: OTSessionDelegate {
func sessionDidConnect(_ session: OTSession) {
print("The client connected to the Vonage Video API session.")
}
func sessionDidDisconnect(_ session: OTSession) {
print("The client disconnected from the Vonage Video API session.")
}
func session(_ session: OTSession, didFailWithError error: OTError) {
print("The client failed to connect to the Vonage Video API session: \(error).")
}
func session(_ session: OTSession, streamCreated stream: OTStream) {
print("A stream was created in the session.")
}
func session(_ session: OTSession, streamDestroyed stream: OTStream) {
print("A stream was destroyed in the session.")
}
}
Publicação de vídeo
Quando um usuário está conectado a uma sessão ativa, ele pode publicar um fluxo de áudio e vídeo na sessão, usando a câmera e o microfone do dispositivo:
Isso é feito adicionando uma propriedade `publisher` à classe `ViewController`:
class ViewController: UIViewController, OTSessionDelegate {
var session: OTSession?
var publisher: OTPublisher?
Modificar a implementação do OTSessionDelegate.sessionDidConnect(_:) método para incluir código que publique um stream na sessão. Veja um exemplo:
func sessionDidConnect(_ session: OTSession) {
print("The client connected to the OpenTok session.")
let settings = OTPublisherSettings()
guard let publisher = OTPublisher(delegate: self, settings: settings) else {
Return
}
var error: OTError?
session.publish(publisher, error: &error)
guard error == nil else {
print(error!)
Return
}
guard let publisherView = publisher.view else {
Return
}
let screenBounds = UIScreen.main.bounds
publisherView.frame = CGRect(x: screenBounds.width - 150 - 20, y: screenBounds.height - 150 - 20, width: 150, height: 150)
view.addSubview(publisherView)
}
O SDK de vídeo da Vonage gerencia a qualidade do vídeo automaticamente, com base nas condições da rede e nos recursos do dispositivo. Dito isso, você pode configurar certas propriedades, como resolução, taxa de quadros, e opção alternativa de áudio.
A seguir, vamos implementar métodos da OTPublisherDelegate protocolo. Esse protocolo inclui métodos para lidar com eventos relacionados ao editor.
Para isso, você pode adicionar o seguinte código ao seu ViewController.swift arquivo:
// MARK: - OTPublisherDelegate callbacks
extension ViewController: OTPublisherDelegate {
func publisher(_ publisher: OTPublisherKit, didFailWithError error: OTError) {
print("The publisher failed: \(error)")
}
}
Ligar/desligar a câmera
O SDK da Vonage oferece métodos simples para controlar a câmera.
Twilio
participant?.unpublishVideoTrack(cameraManager.track)
self.cameraManager = nil
Vonage
// This will only stop publishing Video to the session. You can still see your local preview
publisher.publishVideo = false
// This will only stop publishing all media (audio and video) to the session. You can still see your local preview
var error: OTError?
session.unpublish(publisher, error: &error)
guard error == nil else {
print(error!)
Return
}
Exibir o vídeo de um usuário remoto
Semelhante ao da Twilio participantDidConnect e didSubscribeToVideoTrack ouvintes de eventos; a Vonage também aciona connectionCreated e streamCreated eventos que ocorrem quando um participante remoto se conecta à sessão e começa a enviar vídeo.
Twilio
func participantDidConnect(room: Room, participant: RemoteParticipant) {
print ("Participant \(participant.identity) has joined Room \(room.name)")
// Set the delegate of the remote participant to receive callbacks
participant.delegate = self
}
func participantDidDisconnect(room: Room, participant: RemoteParticipant) {
print ("Participant \(participant.identity) has left Room \(room.name)")
}
func didSubscribeToVideoTrack(videoTrack: RemoteVideoTrack,
publication: RemoteVideoTrackPublication,
participant: RemoteParticipant) {
print("Participant \(participant.identity) added a video track.")
if let remoteView = VideoView.init(frame: self.view.bounds,
delegate:self) {
videoTrack.addRenderer(remoteView)
self.view.addSubview(remoteView)
self.remoteView = remoteView
}
}
Vonage
class ViewController: UIViewController {
var session: OTSession?
var publisher: OTPublisher?
var subscriber: OTSubscriber?
func session(_ session: OTSession, streamCreated stream: OTStream) {
subscriber = OTSubscriber(stream: stream, delegate: self)
guard let subscriber = subscriber else {
return
}
var error: OTError?
session.subscribe(subscriber, error: &error)
guard error == nil else {
print(error!)
return
}
guard let subscriberView = subscriber.view else {
return
}
subscriberView.frame = UIScreen.main.bounds
view.insertSubview(subscriberView, at: 0)
}
// MARK: - OTSubscriberDelegate callbacks
extension ViewController: OTSubscriberDelegate {
public func subscriberDidConnect(toStream subscriber: OTSubscriberKit) {
print("The subscriber did connect to the stream.")
}
public func subscriber(_ subscriber: OTSubscriberKit, didFailWithError error: OTError) {
print("The subscriber failed to connect to the stream.")
}
}
Áudio
O Vonage gerencia tanto o áudio quanto o vídeo por meio de um único objeto Publisher. Ao iniciar a publicação com as opções padrão, o SDK publica tanto o áudio quanto o vídeo. No entanto, se você preferir uma sessão apenas de áudio, poderá configurar o objeto Publisher para que ele não publique vídeo.
Silenciar o microfone
Com o Twilio, é preciso acessar a trilha de áudio para silenciar o microfone. O Vonage simplifica isso ao oferecer um único método que pode ser chamado.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.unpublishAudioTrack(micTrack)
Vonage
publisher.publishAudio = false
Ativar o microfone
Da mesma forma, no Twilio Video, é preciso acessar a trilha de áudio para ativar o microfone. O Vonage simplifica esse processo, oferecendo um único método que pode ser chamado.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.publishAudioTrack(micTrack)
Vonage
publisher.publishAudio = true
Bate-papo por texto
É possível trocar dados (ou seja, mensagens de chat de texto ou mensagens JSON personalizadas) entre participantes individuais de uma sessão, bem como entre todos os participantes de uma sessão.
O método a seguir envia uma mensagem aos clientes conectados à sessão. Cada sinal é definido por uma string que identifica o tipo de mensagem (neste caso, “chat”) e uma string que contém a mensagem:
func sendChatMessage(message: String) {
var error: OTError?
session.signal(withType: "chat", string: message, connection: nil, error: &error)
if let error {
print(error)
}
}
Quando outro cliente conectado à sessão envia uma mensagem, a implementação de um callback a partir de OTSessionDelegate permite que você receba a mensagem:
func session(_ session: OTSession, receivedSignalType type: String?, from connection: OTConnection?, with string: String?) {
print("Received signal type \(type) with message \(string)")
}
Sessões de saída e encerramento O código abaixo mostra como encerrar uma sessão ativa (desconectar um usuário de uma sessão).
Twilio
// To disconnect from a Room, we call:
room?.disconnect()
// This results in a callback to RoomDelegate#roomDidDisconnect(room: Room, error: Error?)
// MARK: RoomDelegate
func roomDidDisconnect(room: Room, error: Error?) {
print("Disconnected from room \(room.name)")
}
Vonage
var error: OTError?
session?.disconnect(&error)
if error != nil {
print(error!)
}
// MARK: OTSessionDelegate
func sessionDidDisconnect(_ session: OTSession) {
print("The client disconnected to the OpenTok session.")
}
Mais informações:
- SDK do iOS para a Video API da Vonage
- Referência do SDK do Vonage Video para iOS: Lista de todas as classes e métodos disponíveis no SDK do iOS
- Exemplos de código (Objective C): Applications de exemplo em Objective-C implementadas com o SDK da Vonage para iOS
- Exemplos de código (Swift): Applications de exemplo baseadas em Swift, implementadas com o SDK do Vonage para iOS
- Tutoriais sobre a criação de aplicativos de vídeo usando os SDKs da Vonage