Flutter получает веб RTC вызовы, когда приложение завершено (отсоединенное состояние)

Вопрос или проблема

Соединение 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);
        }
    }
}

Это позволит автоматически переподключаться при изменении состояния соединения на закрытое. Однако важно также учитывать настройки платформы и, возможно, дополнительные разрешения для выполнения фоновых задач на разных мобильных платформах.

Ограничения

  1. Пользовательский интерфейс: Когда приложение закрыто, вы не сможете обновлять пользовательский интерфейс или получать информацию о приоритетах вызовов.

  2. Управление затратами на батарею: Фоновая работа может потреблять больше ресурсов, что негативно скажется на времени работы устройства от аккумулятора.

  3. Платформенные отличия: Android и iOS имеют разные ограничения для фоновых сервисов. На iOS фоновая работа может быть ограничена и не гарантируется, что ваш фоновый сервис будет работать всегда.

Альтернативные подходы

  1. Push-уведомления: Рассмотрите возможность использования push-уведомлений, чтобы сигнализировать клиенту о новом входящем вызове. Пользователи могут принимать это уведомление, и приложение может быть запущено или активировано для обработки вызова.

  2. Серверная логика: Настройте серверную логику в Asterisk для обработки входящих вызовов, используя SIP-уведомления для связи с клиентом.

В заключение, для того чтобы ваше приложение оставалось доступным для входящих вызовов даже после завершения работы, вам необходимо использовать сочетание фоновых сервисов и, возможно, push-уведомлений. Это обеспечит максимальную доступность вашего приложения, сохраняя при этом оптимальное управление ресурсами устройства.

Оцените материал
Добавить комментарий

Капча загружается...