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 requisitos van más allá de las simples funciones de video e incluyen funciones como transmisión, integración SIP, procesamiento de medios y configuraciones de transmisión personalizables, descubrirás que el SDK para iOS de Vonage Video ofrece una potencia y 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, este 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 cuando se conecta un cliente a una sesión activa.

El siguiente diagrama ilustra las diferencias arquitectónicas entre el 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 credenciales de Video SDK

Crear un desarrollador Account para acceder al portal de desarrolladores.

Para empezar con el vídeo necesitas crear una aplicación. Puede seguir el crear una aplicación guía para obtener su ID de aplicación y clave privada.

Instalar el SDK

Puedes instalar el SDK de Vonage Video para iOS a través de la aplicación Gestor de paquetes Swift o Cocoapods:

Uso del gestor de paquetes 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'

Guarde los cambios en el Podfile, abra el directorio raíz del proyecto en el terminal/línea de comandos y ejecútelo:

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 y, en la parte superior del archivo, añada las siguientes líneas para importar la videoteca:

import UIKit
import OpenTok

Autenticación

El SDK de Vonage Video utiliza tokens para autenticar a los usuarios. Al generar un token, puedes establecer el rol del usuario (suscriptor, editor o moderador). Opcionalmente, 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í.

Como 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, utilice uno de nuestros módulos 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 teclas, ya puedes conectarte a una sesión de vídeo activa.

Debe hacer esto antes de poder publicar su flujo de audio-vídeo en la sesión o ver los flujos de otros 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 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 un flujo de audio-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(_:) para incluir código que publique un flujo en la sesión. He aquí 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 Vonage Video maneja la calidad de video automáticamente, según las condiciones de la red y las capacidades del dispositivo. Dicho esto, puedes configurar ciertas propiedades, tales 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 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 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

Desactivar 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 está definida por un tipo de cadena que identifica el tipo de mensaje (en este caso "chat") y una 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 le 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)")
    }

Abandonar 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: