Guía de migración a Twilio (iOS)
Esta guía te guía a través de la migración de tu aplicación de video Twilio existente a Vonage Video.
Para obtener la máxima flexibilidad y versatilidad en la programación de su solución de vídeo, el SDK para iOS de la API de Video de Vonage te tiene cubierto.
Si tus necesidades van más allá de las funciones básicas de vídeo e incluyen características como la retransmisión, la integración con SIP, el procesamiento de contenidos multimedia y la personalización de la configuración de las transmisiones, descubrirás que el SDK de Vonage Video para iOS ofrece una potencia y una flexibilidad inigualables.
Visión general
Las Video API de Twilio y Vonage tienen conceptos muy similares. Esta guía de inicio pretende ayudarte a migrar tu aplicación de vídeo.
Una diferencia clave entre la implementación de vídeo de Twilio y Vonage es el uso de sala SID, esto es un ID de sesión cuando se trata de Vonage. Veremos cómo generar un identificador de sesión en una sección posterior.
También necesitará un testigo de autenticación al conectar un cliente a una sesión activa.
El siguiente diagrama ilustra las diferencias arquitectónicas entre los servicios de vídeo de Twilio y Vonage.


Mapeo terminológico Twilio Vonage
| Twilio | Vonage |
|---|---|
| Room | Session |
| Participants | Subscriber(s) + Publisher(s) |
| Tracks | Stream |
| RemoteTracks | Subscribers(s).stream |
| LocalTracks | Publisher(s).stream |
Obtener las credenciales del SDK de vídeo
Crear un desarrollador Account para acceder al portal de desarrolladores.
Para empezar a trabajar con vídeo, tienes que crear una aplicación. Puedes seguir las crear una aplicación guía para obtener su ID de la solicitud y clave privada.
Instalar el SDK
Puedes instalar el SDK de Vonage Video para iOS a través de la Gestor de paquetes Swift o Cocoapods:
Uso del gestor de paquetes de Swift
Para añadir una dependencia de paquete a su proyecto Xcode, seleccione Archivo > Paquetes Swift > Añadir dependencia de paquete e introduzca la URL del repositorio:
Uso de Cocoapods
Cuando añada el SDK usando CocoaPods edite el Podfile y añada la siguiente línea:
Guarda los cambios en el archivo Podfile, abre el directorio raíz del proyecto en la terminal o la línea de comandos y ejecuta:
Esto debería extraer el SDK de vídeo de Vonage y sus dependencias.
Ahora puede añadir el SDK a su controlador de vista.
En Xcode, abra su ViewController.swift archivo y, justo al principio del mismo, añade las siguientes líneas para importar la biblioteca de vídeo:
import UIKit
import OpenTok
Autenticación
El SDK de vídeo de Vonage utiliza tokens para autenticar a los usuarios. Al generar un token, puedes establecer el rol del usuario (suscriptor, editor o moderador). Si lo deseas, también puedes asignar una cadena de metadatos al token (es decir, para identificar al cliente conectado).
Consulte nuestra Guía de creación de fichas para aprender a generar tokens. Los tokens se generan en el servidor y se utilizan en el cliente. Visite la página Guías de SDK del lado del servidor para saber más.
Crear una sesión de vídeo
A sesión es como un habitación. Todos los clientes que utilicen el mismo ID de sesión podrán comunicarse entre sí.
Me gusta fichas, sesiones se crean en el servidor. Consulte nuestro Creación de una guía de sesión para saber más.
Para crear una sesión y generar un token, utiliza una de nuestras SDK para servidores.
Puedes declarar todas tus claves como propiedades en tu ViewController.swift archivo:
// Replace with your Application ID
var kApplicationId = ""
// Replace with your generated session ID
var kSessionId = ""
// Replace with your generated token
var kToken = ""
Conectarse a una sesión de vídeo
Una vez configuradas todas las claves, ya puedes conectarte a una sesión de vídeo activa.
Debes hacerlo antes de poder publicar tu transmisión de audio y vídeo en la sesión o ver las transmisiones de los demás 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!)
}
}
Receptores de eventos
Vonage y Twilio tienen protocolos de delegado para ayudarte a mantener el estado de una sesión/llamada para todos los participantes conectados a una sesión.
Cambios en la conexión de la sesión/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.")
}
}
Publicación de vídeos
Cuando un usuario está conectado a una sesión activa, puede publicar una transmisión de audio y vídeo en la sesión utilizando la cámara y el micrófono del dispositivo:
Esto se consigue añadiendo una propiedad publisher a la clase ViewController:
class ViewController: UIViewController, OTSessionDelegate {
var session: OTSession?
var publisher: OTPublisher?
Modificar la aplicación del OTSessionDelegate.sessionDidConnect(_:) Método para incluir código que permita publicar un flujo en la sesión. A continuación se muestra un ejemplo:
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)
}
El SDK de vídeo de Vonage gestiona la calidad del vídeo de forma automática, en función de las condiciones de la red y las capacidades del dispositivo. Dicho esto, puedes configurar ciertas propiedades, como resolución, frecuencia de imageny fallback de audio.
A continuación implementaremos los métodos del OTPublisherDelegate protocolo. Este protocolo incluye métodos para gestionar los eventos relacionados con el editor.
Para ello, puede añadir el siguiente código a su archivo ViewController.swift archivo:
// MARK: - OTPublisherDelegate callbacks
extension ViewController: OTPublisherDelegate {
func publisher(_ publisher: OTPublisherKit, didFailWithError error: OTError) {
print("The publisher failed: \(error)")
}
}
Encender/apagar la cámara
El SDK de Vonage ofrece métodos simples para controlar la cámara.
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
}
Renderizar un vídeo de usuario remoto
Similar a Twilio participantDidConnect y didSubscribeToVideoTrack Además de los oyentes de eventos, Vonage también activa connectionCreated y streamCreated cuando un participante remoto se conecta a la sesión y comienza 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.")
}
}
Audio
Vonage administra tanto el audio como el video utilizando un único objeto editor. Cuando comienzas a publicar con las opciones predeterminadas, el SDK publica tanto audio como video. Sin embargo, si prefieres tener una sesión de solo audio, puedes configurar el objeto editor para que no publique video.
Silenciar el micrófono
Con Twilio, debes obtener la pista de audio para silenciar el micrófono. Vonage simplifica esto al proporcionar un único método invocable.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.unpublishAudioTrack(micTrack)
Vonage
publisher.publishAudio = false
Activar el micrófono
Del mismo modo, con Twilio Video, debes obtener la pista de audio para anular el silencio del micrófono. Vonage simplifica esto proporcionando un único método invocable.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.publishAudioTrack(micTrack)
Vonage
publisher.publishAudio = true
Chat de texto
Puede intercambiar datos (es decir, mensajes de chat de texto o mensajes JSON personalizados) entre participantes individuales de una sesión, así como entre todos los participantes de una sesión.
El siguiente método envía un mensaje a los clientes conectados a la sesión. Cada señal viene definida por una cadena que identifica el tipo de mensaje (en este caso, «chat») y otra cadena que contiene el mensaje:
func sendChatMessage(message: String) {
var error: OTError?
session.signal(withType: "chat", string: message, connection: nil, error: &error)
if let error {
print(error)
}
}
Cuando otro cliente conectado a la sesión envía un mensaje, la implementación de una devolución de llamada de OTSessionDelegate te permite recibir el mensaje:
func session(_ session: OTSession, receivedSignalType type: String?, from connection: OTConnection?, with string: String?) {
print("Received signal type \(type) with message \(string)")
}
Iniciar y finalizar sesiones El siguiente código muestra cómo finalizar una sesión activa (desconectar a un usuario de una sesión).
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.")
}
Más información:
- SDK para iOS de la API de Video de Vonage
- Referencia del SDK de Vonage Video para iOS: Lista de todas las clases y métodos disponibles en el SDK de iOS
- Ejemplos de código (Objective C): Aplicaciones de ejemplo basadas en Objective C implementadas utilizando el SDK de Vonage para iOS.
- Ejemplos de código (Swift): Aplicaciones de muestra basadas en Swift implementadas utilizando el SDK de Vonage para iOS.
- Tutoriales sobre la creación de aplicaciones de vídeo con los SDK de Vonage