Reconexión y resiliencia de la red

Los conmutadores de red y las breves interrupciones en la conectividad pueden interrumpir la transmisión de la llamada. El SDK gestiona la reconexión automáticamente en la mayoría de los casos: utiliza los eventos del ciclo de vida de los medios y las API de reconexión para mantener informados a los usuarios y restablecer la conexión siempre que sea posible.

Cómo funciona la reconexión automática

Cuando el SDK detecta una interrupción en la transmisión (fallo en la conexión ICE, cambio de red), intenta automáticamente restablecer la conexión reiniciando el ICE en la conexión del interlocutor.

Tiempo de respuesta y comportamiento de reintentos

Parámetro Valor Descripción
Número máximo de reintentos automáticos 5 El SDK vuelve a intentarlo hasta 5 veces antes de darse por vencido.
Intervalo de reintento 3 segundos Retardo fijo entre cada intento de reconexión (sin retroceso exponencial)
Tiempo muerto mediático 10 segundos Si no se establece ningún medio de comunicación en un plazo de 10 segundos tras un intento de conexión, el SDK lo considera fallido.
Ventana de recuperación totalmente automática unos 15 segundos 5 intentos x intervalo de 3 s = hasta 15 s de recuperación automática antes de que se produzca un fallo

Qué ocurre en cada etapa

  1. Volver a conectar — El SDK detecta una interrupción en la reproducción multimedia y activa onCallMediaReconnecting. Realiza hasta 5 intentos de reinicio de ICE, con un intervalo de 3 segundos entre cada uno. No es necesaria ninguna intervención por parte del desarrollador durante esta fase.

  2. Conectado de nuevo — Si alguno de los reintentos tiene éxito, el SDK se activa onCallMediaReconnection. Se restablece la transmisión de audio y la llamada continúa con normalidad.

  3. Fallido — Si se agotan los 5 intentos automáticos o si el servidor devuelve un error durante la reconexión, el SDK activa onCallMediaDisconnect. Llegados a este punto:

    • El audio se ha detenido
    • Es posible que la sesión de llamada siga activa en el servidor
    • El desarrollador puede intentar una recuperación manual con reconnectCall(callId) si se ha restablecido la conexión a la red
    • Si no se produce la recuperación, el servidor acabará por interrumpir la llamada y onCallHangup incendios con mediaTimeout razón

Resumen de las acciones del desarrollador

  • Durante el proceso de reconexión: No es necesario realizar ninguna acción. Mostrar un indicador en la interfaz de usuario que indique «reconectando».
  • Al restablecerse la conexión con éxito: Eliminar el indicador y volver a la interfaz de usuario de llamada normal.
  • Al desconectarse (fallo): Intentar, si se desea reconnectCall(callId) Si detectas que la red ha vuelto a funcionar. De lo contrario, informa al usuario de que se ha perdido la llamada.

Reconexión a nivel de sesión

Además de la reconexión de los medios, el SDK también vuelve a conectar automáticamente la sesión de WebSocket cuando se interrumpe la conexión:

Parámetro Valor
Número máximo de intentos de reconexión 5
Retardo de reconexión 5 segundos (con un factor de aleatorización de 0,75)

Se activan las reconexiones de sesión onReconnecting y onReconnection eventos (distintos de los eventos de medios de llamada mencionados anteriormente).

onCallMediaDisconnect

Se activa cuando se pierde definitivamente la conexión con el medio —una vez agotados los 5 intentos de reconexión automática, o tras un error irrecuperable del servidor—. En ese momento, la transmisión de audio se ha interrumpido, pero es posible que la sesión de llamada siga activa en el servidor. Puedes intentar una recuperación manual con reconnectCall(callId).

client.on(
  'callMediaDisconnect',
  (callId: string, reason: CallDisconnectReason) => {
    if (reason === 'networkChange') {
      console.log(`Call ${callId} was disconnected due to a network change`);
    } else {
      exhaustiveCheck(reason);
    }
  }
);
 client.setOnCallMediaDisconnectListener { legId, reason ->
     when (reason) {
         CallDisconnectReason.networkChange -> println("Received call media disconnect $reason for Call $legId")
     }

 }
 client.setOnCallMediaDisconnectListener((legId, reason) -> {
     if (reason == CallDisconnectReason.networkChange) {
         System.out.println("Received call media disconnect " + reason + " for Call " + legId);
     }
     return null;
 });
 func voiceClient(_ client: VGVoiceClient, didReceiveMediaDisconnectForCall callId: VGCallId, reason: VGCallDisconnectReason) {
     print("leg \(callId) has received media disconnect for \(reason)")
 }
 - (void) voiceClient:(VGVoiceClient *)client didReceiveMediaDisconnectForCall:(VGCallId)callId reason:(VGCallDisconnectReason)reason {
     NSLog(@"Leg %@ has received media disconnect for reason %ld", callId, reason);
 }

onCallMediaReconnecting

Se activa cuando el SDK detecta una interrupción en la transmisión multimedia (como un cambio de red entre Wi-Fi y datos móviles) e intenta restablecer la conexión automáticamente. No es necesaria ninguna acción por parte del usuario; muestra un indicador de «reconectando» en tu interfaz de usuario.

client.on('callMediaReconnecting', (callId) => {
  console.log(`Call media is reconnecting for call ${callId}`);
});
 client.setOnCallMediaReconnectingListener { legId ->
     println("Received call media reconnecting for Call $legId")
 }
 client.setOnCallMediaReconnectingListener((legId) -> {
     System.out.println("Received call media reconnecting for Call " + legId);
     return null;
 });
 func voiceClient(_ client: VGVoiceClient, didReceiveMediaReconnectingForCall callId: VGCallId) {
     print("leg \(callId) is Reconnecting")
 }
 - (void) voiceClient:(VGVoiceClient *)client didReceiveMediaReconnectingForCall:(VGCallId)callId {
     NSLog(@"Leg %@ is reconnecting", callId);
 }

Reconexión multimedia en llamada

Se activa cuando el SDK restablece correctamente la conexión multimedia tras una interrupción. Elimina el indicador de reconexión y vuelve a la interfaz de usuario normal de la llamada.

client.on('callMediaReconnection', (callId) => {
  console.log(`Call media is reconnected for call ${callId}`);
});
 client.setOnCallMediaReconnectionListener { legId ->
     println("Received call media reconnection for Call $legId")
 }
 client.setOnCallMediaReconnectionListener((legId) -> {
     System.out.println("Received call media reconnection for Call " + legId);
     return null;
 });
 func voiceClient(_ client: VGVoiceClient, didReceiveMediaReconnectionForCall callId: VGCallId) {
     print("leg \(callId) has received media reconnection")
 }
 - (void) voiceClient:(VGVoiceClient *)client didReceiveMediaReconnectionForCall:(VGCallId)callId {
     NSLog(@"Leg %@ has received media reconnection", callId);
 }

Reconexión manual

Uso reconnectCall(callId) cuando tu aplicación decide activar la recuperación de forma explícita —por ejemplo, tras recibir onCallMediaDisconnect y comprobar que se ha restablecido la conexión a la red.

La reconexión manual también sigue la misma lógica de reintentos (hasta 5 intentos, con un intervalo de 3 segundos entre ellos) una vez que se activa.

const callId = 'callId';
await client.reconnectCall(callId);
 // Callback
 client.reconnectCall("callId") {
     it?.let { err ->
         // Handle Error in reconnecting call
         println("Error in reconnecting call: $err")
     }
 }
 // Coroutine
 try {
     client.reconnectCall("callId")
 }
 catch (e:Error) {
     // Handle Error in reconnecting call
 }

 client.reconnectCall("callId", it -> {
     if (it != null) {
         // Handle Error in reconnecting call
         System.out.println("Error in reconnecting call: " + it);
     }
     return null;
 });
 // Callback
 client.reconnectCall("someCallId") { error in
     guard error != nil else {
         print("Failed to reconnect \(error?.localizedDescription ?? "")")
         return
     }
 }
 
 /// Async Await
 Task.detached {
     do {
         try await client.reconnectCall("someCallId")
     }
     catch {
         print("error")
     }
 }
 [client reconnect:@"someCallId" callback:^(NSError * _Nullable error) {
         if(error){
             NSLog(@"Failed to reconnect: %@", error);
         }
 }];

Requisitos de Android

La recuperación automática tras un cambio de red en Android requiere:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Comportamiento ante fallos y experiencia de usuario

  • Si fallan todos los reintentos automáticos y no se consigue ninguna reconexión manual, onCallHangup acaba activándose con mediaTimeout razón.
  • Mostrar un indicador de reconexión cuando onCallMediaReconnecting incendios.
  • Volver a la interfaz de usuario normal de llamadas solo después de onCallMediaReconnection incendios.
  • El onCallMediaDisconnect, informar al usuario y, si se desea, ofrecer un botón «Reintentar» que llame a reconnectCall(callId).