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.

Vonage Twilio migraiton illustration 1

Vonage Twilio migraiton illustration 1

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:

https://github.com/vonage/vonage-video-client-sdk-swift.git

Uso de Cocoapods

Cuando añada el SDK usando CocoaPods edite el Podfile y añada la siguiente línea:

pod 'OTXCFramework'

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:

pod install

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: