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:
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
-
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
JWTkönnte nach den JWT-Standards gültig sein, einige Angaben könnten jedoch gemäß den Vonage-Anforderungen falsch sein. Versuchen Sie, eine neueJWTund 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 klickenSave 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
subAnspruch. 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.