Вопрос или проблема
Соединение Websocket закрывается резко в asterisk с использованием соединения Web RTC, когда мое приложение на Flutter завершает работу (пользователь проводит пальцем, чтобы закрыть приложение)
Версия Flutter
Flutter 3.24.0 • канал стабильный • https://github.com/flutter/flutter.git
Фреймворк • ревизия 80c2e84975 (3 месяца назад) • 2024-07-30 23:06:49 +0700
Движок • ревизия b8800d88be
Инструменты • Dart 3.5.0 • DevTools 2.37.2
Используемая библиотека Flutter
sip_ua: https://pub.dev/packages/sip_ua
Версия Asterisk
Asterisk 20.4.0
Я пытался использовать flutter background service, чтобы открыть соединение, как только соединение закрыто:
@pragma('vm:entry-point')
static void onStart(ServiceInstance service) async {
print("задний сервис вызова запускается");
SipUAListenerBackground newListener = SipUAListenerBackground();
SipHelperManager().getHelper().addSipUaHelperListener(newListener);
}
и для моего SipUAListenerBackground:
class SipUAListenerBackground implements SipUaHelperListener {
@override
void transportStateChanged(TransportState state) {
// Если состояние закрыто
// ...
UaSettings settings = UaSettings()
..webSocketUrl = savedLoginInfo['websocketUrl']
..uri = 'sip:${savedLoginInfo['username']}@${savedLoginInfo['server']}'
..authorizationUser = savedLoginInfo['authorizationUser']
..password = savedLoginInfo['password']
..displayName = savedLoginInfo['displayName']
..userAgent="Flutter SIP Client"
..dtmfMode = DtmfMode.RFC2833;
await _sipHelper!.start(settings);
}
}
Так что есть ли способ сохранить мое соединение websocket активным, чтобы слушать новые входящие вызовы, даже когда приложение завершено? Любая помощь была бы оценена
Ответ или решение
Для решения проблемы с WebRTC-вызовами в состоянии, когда приложение Flutter находится в "мертвом" (terminated) состоянии, требуется детальный подход к управлению состоянием подключения и фоновым выполнением. Рассмотрим основные аспекты этой задачи.
Проблема с закрытием WebSocket-соединения
Когда пользователь закрывает приложение (даже случайно), ваше WebSocket-соединение прерывается. Это приводит к закрытию всех активных коммуникаций, и ваш сервер Asterisk больше не может отправлять вызовы в ваше приложение. Однако важность этого вопроса обусловлена тем, что вы хотите оставаться доступным для входящих вызовов, даже когда приложение не активно.
Использование фоновых сервисов
Вы уже начали использовать пакет flutter_background_service
. Это действительно правильный подход, поскольку он позволяет вам выполнять некоторые задачи в фоновом режиме, даже когда приложение не взаимодействует с пользователем. Однако, стоит учитывать, что полное восстановление WebSocket-соединения, когда приложение закрыто, может быть ограничено.
Реализация фонового сервиса
Ваш код для уже реализованного фонового сервиса может быть немного улучшен. Убедитесь, что вы обрабатываете все состояния подключения к WebSocket и корректно повторно инициируете соединение, как это предложено в вашем коде:
@pragma('vm:entry-point')
static void onStart(ServiceInstance service) async {
print("Фоновый сервис запускается");
SipUAListenerBackground newListener = SipUAListenerBackground();
SipHelperManager().getHelper().addSipUaHelperListener(newListener);
}
class SipUAListenerBackground implements SipUaHelperListener {
@override
void transportStateChanged(TransportState state) async {
if (state == TransportState.CLOSED) {
UaSettings settings = UaSettings()
..webSocketUrl = savedLoginInfo['websocketUrl']
..uri = 'sip:${savedLoginInfo['username']}@${savedLoginInfo['server']}'
..authorizationUser = savedLoginInfo['authorizationUser']
..password = savedLoginInfo['password']
..displayName = savedLoginInfo['displayName']
..userAgent = "Flutter SIP Client"
..dtmfMode = DtmfMode.RFC2833;
await _sipHelper!.start(settings);
}
}
}
Это позволит автоматически переподключаться при изменении состояния соединения на закрытое. Однако важно также учитывать настройки платформы и, возможно, дополнительные разрешения для выполнения фоновых задач на разных мобильных платформах.
Ограничения
-
Пользовательский интерфейс: Когда приложение закрыто, вы не сможете обновлять пользовательский интерфейс или получать информацию о приоритетах вызовов.
-
Управление затратами на батарею: Фоновая работа может потреблять больше ресурсов, что негативно скажется на времени работы устройства от аккумулятора.
-
Платформенные отличия: Android и iOS имеют разные ограничения для фоновых сервисов. На iOS фоновая работа может быть ограничена и не гарантируется, что ваш фоновый сервис будет работать всегда.
Альтернативные подходы
-
Push-уведомления: Рассмотрите возможность использования push-уведомлений, чтобы сигнализировать клиенту о новом входящем вызове. Пользователи могут принимать это уведомление, и приложение может быть запущено или активировано для обработки вызова.
-
Серверная логика: Настройте серверную логику в Asterisk для обработки входящих вызовов, используя SIP-уведомления для связи с клиентом.
В заключение, для того чтобы ваше приложение оставалось доступным для входящих вызовов даже после завершения работы, вам необходимо использовать сочетание фоновых сервисов и, возможно, push-уведомлений. Это обеспечит максимальную доступность вашего приложения, сохраняя при этом оптимальное управление ресурсами устройства.