Solución de problemas

Problemas conocidos

En esta sección se ofrece una descripción general concisa de los problemas conocidos específicos de cada plataforma, dispositivo y navegador que pueden surgir al integrar el Vonage Client SDK en tus aplicaciones web.

Client SDK Integration

User Media Devices Not Being Released

Se ha detectado un problema en Safari por el que los dispositivos multimedia de los usuarios no se liberan a pesar de que la conexión entre pares se haya desconectado. Esto puede provocar un comportamiento inesperado y un consumo excesivo de recursos. Tenlo en cuenta a la hora de implementar tus aplicaciones web utilizando el Vonage Client SDK para web.

En esta sección se ofrece una descripción general concisa de los problemas conocidos, específicos de la plataforma y del dispositivo, que pueden surgir al integrar el Vonage Client SDK en tus aplicaciones de Android.

Voice SDK Integration

Handling isIncomingCallPermitted Exception

Si estás utilizando el isIncomingCallPermitted método de TelecomManager; ten en cuenta que puede lanzar excepciones en determinados dispositivos, como los de Xiaomi. Para garantizar un funcionamiento fluido, se recomienda incluir esta llamada al método dentro de un bloque «try-catch» y establecer un valor por defecto de «true» en caso de que se produzca una excepción. De lo contrario, la aplicación podría tener problemas a la hora de realizar llamadas entrantes. A continuación te explicamos cómo puedes implementarlo:

// Get the TelecomManager instance
val telecomManager = context.getSystemService(AppCompatActivity.TELECOM_SERVICE) as TelecomManager

// Check permissions for incoming calls and handle exceptions
val isIncomingCallPermitted = try {
    telecomManager.isIncomingCallPermitted(phoneAccountHandle)
} catch (_: Exception) {
    // Exception occurred, default to true
    true
}

Al adoptar este enfoque, tu aplicación podrá gestionar correctamente las posibles excepciones, garantizando un funcionamiento ininterrumpido, especialmente en aquellos dispositivos en los que el método `isIncomingCallPermitted` pueda generar errores.

ConnectionService Unavailability Workaround

En determinados dispositivos, como los smartphones Samsung en modo avión, es posible que el ConnectionService no esté disponible para gestionar las llamadas salientes, lo que puede provocar problemas. Para solucionar esto, proponemos una solución alternativa que permite realizar llamadas a pesar de que el ConnectionService no esté disponible.

Workaround for Placing Outgoing Calls

Para solucionar la indisponibilidad del ConnectionService, utiliza el siguiente fragmento de código en tu aplicación para realizar llamadas salientes:

// Workaround for placing outgoing calls when ConnectionService is not available
private fun placeOutgoingCall(callId: CallId, callee: String) {
    try {
        coreContext.telecomHelper.startOutgoingCall(callId, callee)

        // If ConnectionService does not respond within 3 seconds,
        // we mock an outgoing connection
        TimerManager.startTimer(TimerManager.CONNECTION_SERVICE_TIMER, 3000) {
            mockOutgoingConnection(callId, callee)
        }
    } catch (e: Exception) {
        abortOutboundCall(callId, e.message)
    }
}

/**
 * This method will mock `ConnectionService#onCreateOutgoingConnection`,
 * allowing outgoing calls without direct interaction with the Telecom framework.
 */
private fun mockOutgoingConnection(callId: CallId, to: String): CallConnection {
    showToast(context, "ConnectionService Not Available")

    val connection = CallConnection(callId).apply {
        setAddress(Uri.parse(to), TelecomManager.PRESENTATION_ALLOWED)
        setCallerDisplayName(to, TelecomManager.PRESENTATION_ALLOWED)
        setDialing()
    }

    return connection
}

ConnectionService Implementation

A continuación, asegúrate de que tu clase implemente los métodos necesarios de ConnectionService tal y como se muestra a continuación:

import android.telecom.Connection
import android.telecom.ConnectionRequest
import android.telecom.PhoneAccountHandle
import android.telecom.ConnectionService
import android.telecom.TelecomManager

// Your class implementing ConnectionService
class YourConnectionService : ConnectionService() {

    override fun onCreateOutgoingConnection(
        connectionManagerPhoneAccount: PhoneAccountHandle?,
        request: ConnectionRequest?
    ): Connection {
        // Cancel the timer set in the workaround
        TimerManager.cancelTimer(TimerManager.CONNECTION_SERVICE_TIMER)

        // Your implementation of ConnectionService onCreateOutgoingConnection method
        // ... (code snippet)

        return connection
    }

    override fun onCreateOutgoingConnectionFailed(connectionManagerPhoneAccount: PhoneAccountHandle?, request: ConnectionRequest?) {
        // Cancel the timer set in the workaround
        TimerManager.cancelTimer(TimerManager.CONNECTION_SERVICE_TIMER)

        // Your implementation of ConnectionService onCreateOutgoingConnectionFailed method
        // ... (code snippet)
    }
}

TimerManager Utility

El TimerManager La clase utilizada en la solución alternativa es simplemente una clase de utilidad personalizada que permite configurar un temporizador para una función de devolución de llamada. Garantiza que la función se ejecute si el temporizador no se cancela antes de que transcurra el tiempo especificado.

object TimerManager {
    private val handler: Handler = Handler(Looper.getMainLooper())
    private val timerMap: MutableMap<String, Runnable> = mutableMapOf()

    const val CONNECTION_SERVICE_TIMER = "ConnectionServiceTimer"

    fun startTimer(timerId: String, delayMillis: Long, callback: () -> Unit) {
        val runnable = Runnable {
            callback.invoke()
            timerMap.remove(timerId)
        }
        timerMap[timerId] = runnable
        handler.postDelayed(runnable, delayMillis)
    }

    fun cancelTimer(timerId: String) {
        val runnable = timerMap[timerId]
        if (runnable != null) {
            handler.removeCallbacks(runnable)
            timerMap.remove(timerId)
        }
    }
}

Al incorporar esta solución alternativa y la utilidad TimerManager, tu aplicación gestionará de forma eficaz las llamadas salientes, incluso en dispositivos en los que el ConnectionService pueda no funcionar correctamente.

En esta sección se ofrece una descripción general concisa de los problemas conocidos, específicos de la plataforma y del dispositivo, que pueden surgir al integrar el Vonage Client SDK en tus aplicaciones para iOS.

Voice SDK Integration

Speakerphone Issues

Si tienes problemas con el botón de altavoz durante las llamadas, como fallos o falta de respuesta, asegúrate de que no estés interfiriendo con el AVAudioSession.sharedInstance().

El Client SDK ya se encarga de gestionar la sesión de audio por ti, así que evitar manipularlo directamente con código como:

AVAudioSession.sharedInstance().setCategory(.playAndRecord)   

Ten por seguro que el Client SDK se encarga de gestionar la sesión de audio.

Para los usuarios que utilicen CallKit, sigue siendo necesario llamar a VGVoiceClient.enableAudio(audioSession) y VGVoiceClient.disableAudio(audioSession) con la «audioSession» proporcionada por los métodos delegados de CallKit.

Trabajar con la CLI de Vonage

Configuración de la aplicación Vonage

Debido a que puedes crear múltiples aplicaciones de Vonage, los comandos que ejecutes harán referencia a la aplicación que se configuró. Por ejemplo, cuando creas un usuario, debes asegurarte de crearlo en la aplicación que pretendías.

  • Comprueba la aplicación a la que hace referencia tu CLI ejecutando:
cat vonage_app.json

No responde a las órdenes

Si ejecutas un comando y no obtienes respuesta:

  • Intenta asegurarte de que todos los objetos JSON de tu comando estén bien cerrados y de que no falte ninguno. } o ' por ejemplo.

JWT

Recuerda que un JWT es por usuario por Vonage Applications.

Error de token no válido

  • Descodifique su JWT

  • Asegúrese de que el "application_id" es correcta.

  • Asegúrese de que el "sub" Es correcto. Es decir, existe un usuario con ese nombre de usuario en tu aplicación de Vonage.

  • Asegúrate de que el JWT no haya caducado:

    • Encontrará la fecha de caducidad en "exp"en tiempo Unix, que son segundos desde el 01 Ene 1970(UTC).

    • Puedes convertirlo en tiempo humano.

    • Asegúrate de que la fecha de caducidad sea futura, es decir, que el JWT aún no haya caducado.

Error de conexión o tiempo de espera de conexión agotado

Si aparece el error «Error de conexión» o «Tiempo de espera de conexión agotado» al intentar iniciar sesión en el SDK:

  • Comprueba la conexión a Internet de tu dispositivo.

  • Entonces JWT Puede que sea válido según los estándares de JWT, pero incluir ciertas reclamaciones podría no cumplir con los requisitos de Vonage. Intenta generar uno nuevo JWT, al tiempo que se garantiza la veracidad de las afirmaciones específicas sobre Vonage.

Errores al generar un JWT

  • Asegúrese de que el archivo de clave privada existe. Se genera en la máquina en la que ha creado la aplicación.

  • En nuestra documentación, cuando se utiliza la CLI, recomendamos utilizar la ruta ./private.key.

  • Asegúrate de que tu clave privada se encuentre en el equipo en el que estás generando el JWT y de que la ruta sea correcta.

  • Si necesitas una nueva clave privada:

    • Puede obtener uno en la Panel de control. En el menú de la izquierda seleccione Voz → Sus aplicaciones → seleccione la aplicación → Editar. En la parte inferior pulse Generate public / private key pair. No olvides hacer clic en Save changes.

    • Guarde el archivo en su máquina y actualice la ruta cuando genere el JWT.

Notificaciones Push

  • Asegúrate de haber subido el certificado al servidor de Vonage. Debes disponer de un JWT de administrador válido, es decir, un JWT sin el sub reclamar. Usted puede Descodifique su JWT para asegurarme.

  • Asegúrese de que ha activado las notificaciones push y de que el método client.registerVoipToken() se ha realizado correctamente. También puede poner una llamada de registro o un punto de interrupción para asegurarse de que la llamada se ha realizado correctamente.

¿Tiene más preguntas?

Si tiene alguna pregunta, problema o comentario, póngase en contacto con nosotros en devrel@vonage.com o el Slack de la comunidad de desarrolladores de Vonage.