Fehlersuche

Bekannte Probleme

Dieser Abschnitt bietet einen kurzen Überblick über plattform-, geräte- und browserspezifische bekannte Probleme, die bei der Integration des Vonage Client SDK in Ihre Webanwendungen auftreten können.

Client SDK Integration

User Media Devices Not Being Released

In Safari wurde ein Problem festgestellt, bei dem die Mediengeräte der Benutzer nicht freigegeben werden, obwohl die Peer-Verbindung getrennt wurde. Dies kann zu unerwartetem Verhalten und einer erhöhten Ressourcenauslastung führen. Bitte berücksichtigen Sie dies bei der Implementierung Ihrer Web-Applications mit dem Vonage Client SDK für das Web.

Dieser Abschnitt bietet einen kurzen Überblick über plattform- und gerätespezifische bekannte Probleme, die bei der Integration des Vonage Client SDK in Ihre Android-Applications auftreten können.

Voice SDK Integration

Handling isIncomingCallPermitted Exception

Wenn Sie die isIncomingCallPermitted Methode aus dem TelecomManager – beachten Sie, dass auf bestimmten Geräten, wie z. B. Xiaomi, Ausnahmen ausgelöst werden können. Um einen reibungslosen Betrieb zu gewährleisten, wird empfohlen, diesen Methodenaufruf in einen try-catch-Block einzuschließen und für den Fall einer Ausnahme den Standardwert auf „true“ zu setzen. Andernfalls kann es bei der App zu Problemen beim Tätigen von ausgehenden Anrufen kommen. So können Sie dies implementieren:

// 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
}

Durch diesen Ansatz kann Ihre Anwendung potenzielle Ausnahmen reibungslos verarbeiten und so einen unterbrechungsfreien Betrieb gewährleisten – insbesondere auf Geräten, auf denen die Methode „isIncomingCallPermitted“ Fehler auslösen kann.

ConnectionService Unavailability Workaround

Auf bestimmten Geräten, wie beispielsweise Samsung-Smartphones im Flugmodus, steht der ConnectionService möglicherweise nicht für ausgehende Anrufe zur Verfügung, was zu möglichen Problemen führen kann. Um dieses Problem zu beheben, stellen wir eine Abhilfemaßnahme vor, mit der Anrufe trotz der Nichtverfügbarkeit des ConnectionService getätigt werden können.

Workaround for Placing Outgoing Calls

Um die Nichtverfügbarkeit des ConnectionService zu umgehen, verwenden Sie den folgenden Codeausschnitt in Ihrer Anwendung, um ausgehende Anrufe zu tätigen:

// 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

Stellen Sie anschließend sicher, dass Ihre Klasse die erforderlichen ConnectionService-Methoden wie unten gezeigt implementiert:

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

Die TimerManager Bei der in der Problemumgehung verwendeten Klasse handelt es sich lediglich um eine benutzerdefinierte Hilfsklasse, mit der Sie einen Timer für eine Callback-Funktion setzen können. Sie stellt sicher, dass die Funktion ausgeführt wird, sofern der Timer nicht vor Ablauf der angegebenen Dauer abgebrochen wird.

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)
        }
    }
}

Durch die Einbindung dieser Umgehungslösung und des TimerManager-Dienstprogramms kann Ihre Anwendung ausgehende Anrufe auch auf Geräten, auf denen der ConnectionService möglicherweise nicht korrekt funktioniert, effektiv verwalten.

Dieser Abschnitt bietet einen kurzen Überblick über plattform- und gerätespezifische bekannte Probleme, die bei der Integration des Vonage Client SDK in Ihre iOS-Applications auftreten können.

Voice SDK Integration

Speakerphone Issues

Sollten bei Anrufen Probleme mit Ihrer Freisprechtaste auftreten, wie z. B. Abstürze oder ein Ausbleiben der Reaktion, stellen Sie sicher, dass Sie die AVAudioSession.sharedInstance().

Das Client SDK übernimmt bereits die Verwaltung der Audiositzung für Sie, daher vermeiden indem man es direkt mit Code wie dem folgenden bearbeitet:

AVAudioSession.sharedInstance().setCategory(.playAndRecord)   

Seien Sie versichert, dass das Client SDK die Verwaltung der Audiositzung übernimmt.

Für Nutzer, die CallKit verwenden, ist es weiterhin erforderlich, folgende Funktion aufzurufen: VGVoiceClient.enableAudio(audioSession) und VGVoiceClient.disableAudio(audioSession) mit der „audioSession“, die von den Delegate-Methoden von CallKit bereitgestellt wird.

Arbeiten mit der Vonage CLI

Vonage Applikation einrichten

Da Sie mehrere Vonage-Applikationen erstellen können, beziehen sich die von Ihnen ausgeführten Befehle auf die eingerichtete Applikation. Wenn Sie z. B. einen Benutzer anlegen, müssen Sie sicherstellen, dass Sie ihn in der gewünschten Anwendung anlegen.

  • Überprüfen Sie die Anwendung, auf die sich Ihre CLI bezieht, indem Sie sie ausführen:
cat vonage_app.json

Keine Reaktion auf Befehle

Wenn Sie einen Befehl ausführen und keine Antwort erhalten:

  • Versuchen Sie sicherzustellen, dass alle JSON-Objekte in Ihrem Befehl geschlossene Objekte sind und keine } oder ' zum Beispiel.

JWTs

Denken Sie daran, dass ein JWT pro Benutzer und pro Vonage-Applikation gilt.

Ungültiger Token-Fehler

  • Entschlüsseln Sie Ihr JWT

  • Stellen Sie sicher, dass die "application_id" Behauptung richtig ist.

  • Stellen Sie sicher, dass die "sub" korrekt ist. Das bedeutet, dass ein Benutzer mit diesem Benutzernamen in Ihrer Vonage-Anwendung existiert.

  • Stellen Sie sicher, dass das JWT nicht abgelaufen ist:

    • Sie finden das Verfallsdatum auf "exp"in Unix-Zeit, d.h. in Sekunden seit dem 01. Januar 1970 (UTC).

    • Sie können in menschliche Zeit umrechnen.

    • Stellen Sie sicher, dass die Ablaufzeit in der Zukunft liegt, d. h., dass der JWT noch nicht abgelaufen ist.

Verbindungsfehler oder Zeitüberschreitung der Verbindung

Beim Versuch, sich beim SDK anzumelden, wird ein Verbindungsfehler oder eine Zeitüberschreitung der Verbindung angezeigt:

  • Überprüfen Sie die Internetverbindung auf Ihrem Gerät.

  • Dann JWT könnte nach den JWT-Standards gültig sein, einige Angaben könnten jedoch gemäß den Vonage-Anforderungen falsch sein. Versuchen Sie, eine neue JWTund gleichzeitig die Korrektheit Ihrer Vonage-spezifischen Ansprüche zu gewährleisten.

Fehler beim Erzeugen eines JWT

  • Stellen Sie sicher, dass die private Schlüsseldatei vorhanden ist. Sie wird auf dem Rechner generiert, auf dem Sie die Anwendung erstellt haben.

  • In unseren Dokumenten wird bei der Verwendung der CLI vorgeschlagen, den Pfad ./private.key.

  • Vergewissern Sie sich, dass Ihr privater Schlüssel auf dem Rechner existiert, mit dem Sie das JWT erzeugen, und dass der Pfad korrekt ist.

  • Wenn Sie einen neuen privaten Schlüssel benötigen:

    • Sie erhalten es bei der Dashboard. Wählen Sie im Menü auf der linken Seite Stimme → Ihre Applications → wählen Sie die Applikation → Bearbeiten. Klicken Sie am unteren Rand auf Generate public / private key pair. Vergessen Sie nicht zu klicken Save changes.

    • Speichern Sie die Datei auf Ihrem Rechner und aktualisieren Sie den Pfad zu ihr, wenn Sie das JWT generieren.

Push-Benachrichtigungen

  • Stellen Sie sicher, dass Sie das Zertifikat auf den Server von Vonage hochgeladen haben. Sie benötigen ein gültiges Admin-JWT, also ein JWT ohne das sub Anspruch. Sie können Entschlüsseln Sie Ihr JWT um sicher zu gehen.

  • Stellen Sie sicher, dass Sie Push-Benachrichtigungen aktiviert haben und dass die Methode client.registerVoipToken() erfolgreich war. Sie können auch einen Protokollaufruf oder einen Haltepunkt setzen, um sicherzustellen, dass der Aufruf erfolgreich war.

Haben Sie weitere Fragen?

Sollten Sie weitere Fragen, Probleme oder Feedback haben, kontaktieren Sie uns bitte unter devrel@vonage.com oder die Vonage Entwickler-Community Slack.