SIP-сообщения не достигают Asterisk, когда VoIP-приложение на iOS находится в фоновом режиме.

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

Я работаю над VoIP-приложением для iOS, используя jssip, WebRTC и Asterisk (SIP по TCP). Мое приложение использует уведомления VoIP Push (pushkit + callKit) для обработки входящих звонков. У нас есть система, которая записывает данные о звонках в Firestore, а затем использует CloudFunction, которая слушает Firestore и инициирует APNs для отправки уведомлений о звонках на устройство.

Проблема, с которой я столкнулся, заключается в том, что когда приложение находится в фоновом режиме, оно не получает входящие звонки. После некоторой отладки я выяснил, что проблема не в уведомлениях. Вместо этого SIP-сообщения (100 trying и 180 ringing) от приложения не доходят до Asterisk. Из-за этого данные о звонках не записываются в Firestore, поэтому уведомления о входящих звонках не отправляются в приложение. Когда приложение возвращается на передний план, эти SIP-сообщения успешно отправляются в Asterisk.

Интересно, что сообщения SIP-ретрансляции отправляются и принимаются нормально, даже в фоновом режиме. Это заставляет меня задуматься, не блокирует ли что-то другие SIP-сообщения (100 trying + 180 ringing), когда приложение находится в фоновом режиме.
SIP-поток при начале звонка

Вот что я сделал:

  • Фоновые режимы: включены уведомления VoIP, фоновая выборка и удаленные уведомления.
  • Pushkit и уведомления VoIP: установлены необходимые сертификаты и настроены в проекте.
  • SIP Keep-Alive: убедился, что соединение поддерживается. Порт и IP, используемые для связи с Asterisk, остаются теми же.
  • Убедился, что проблема не в уведомлениях: если данные о звонках присутствуют в Firestore, система уведомлений о звонках работает прекрасно, даже если приложение находится в фоновом режиме или устройство спит.

Каковы могут быть причины этого и как мы можем это исправить? Сталкивался ли кто-то другой с аналогичной проблемой?

Ответ или решение

Проблема: SIP сообщения не достигают Asterisk при работе iOS VoIP приложения в фоновом режиме

Фон

Вы работаете над VoIP приложением для iOS, использующим jssip, WebRTC и Asterisk по протоколу SIP через TCP. Главная задача вашего приложения — обрабатывать входящие звонки, используя Push-уведомления VoIP (PushKit и CallKit). Логи звонков записываются в Firestore, и облачная функция (CloudFunction) отслеживает Firestore для отправки уведомлений о звонках через APNs. Однако вы сталкиваетесь с проблемой: SIP сообщения (100 Trying и 180 Ringing) не проходят до Asterisk, когда приложение находится в фоновом режиме.

Признаки проблемы

  • Зарегистрированные сообщения SIP: При работе приложения в фоновом режиме не доходят SIP сообщения 100 Trying и 180 Ringing до Asterisk, что мешает регистрации данных вызова в Firestore.
  • Успешные регистрации: SIP сообщения о повторной регистрации (re-registration) обрабатываются без проблем, даже если приложение находится в фоне.
  • Работа с Firestore: Система уведомлений работает нормально, как только данные вызова появляются в Firestore, независимо от того, находится ли приложение в фоне или устройство в спящем режиме.

Возможные причины проблемы

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

  2. Настройки PushKit: Возможно, PushKit Notifications не достаточно досконально реализованы для обработки определенных SIP пакетов. Вам необходимо убедиться, что уведомления организованы правильно и могут "разбудить" приложение для обработки важного SIP трафика.

  3. Пропускная способность сети: В условиях ограниченной пропускной способности или если устройство находится в состоянии ожидания (например, в результате низкой активности пользователя), SIP сообщения могут теряться или блокироваться. Убедитесь, что у вас есть стабильное интернет-соединение.

  4. Проблемы с конфигурацией Asterisk: Проверьте конфигурацию на стороне Asterisk, чтобы удостовериться, что сообщения правильно обрабатываются и разрешаются. Возможно, необходимо увеличить таймауты и частоту отправки SIP keep-alive сообщений.

  5. Логирование и отладка: Отсутствие логов о неудачных SIP попытках может указывать на проблемы с сетевыми настройками или самими сообщениями. Проверьте сетевой трафик с помощью инструмента анализа пакетов, чтобы удостовериться, что SIP сообщения действительно покидают устройство.

Рекомендованные действия

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

  2. Оптимизация SIP логики: Пересмотрите ваш код jssip и расчеты SIP сообщений. Возможно, следует изменить стратегию обработки событий SIP.

  3. Используйте средства для диагностики: Воспользуйтесь инструментами, такими как Wireshark или Charles Proxy, для захвата и анализа SIP трафика. Это поможет вам различить, в какой момент и где сообщения теряются.

  4. Работа с Asterisk: Убедитесь, что Asterisk настроен для обработки входящих сообщений, даже если приложение iOS находится в фоновом режиме. Возможно, потребуется изменить таймауты обработки сообщений или проверок.

  5. Мониторинг задержек: Если проблема заключается в задержках сети, рассмотрите возможность оптимизации ваших сетевых соединений или использования альтернативных методов передачи данных.

Заключение

Решение проблемы, с которой вы столкнулись, требует комплексного подхода. Убедитесь, что ваше приложение отвечает требованиям iOS в отношении фоновой работы, оптимизируйте логику обработки SIP сообщений и детально проверьте настройки на стороне Asterisk. Тщательное тестирование и анализ помогут вам устранить эту проблему и обеспечить надежную работу вашего VoIP приложения, даже когда оно находится в фоновом режиме.

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

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