Вопрос или проблема
Я работаю над 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, независимо от того, находится ли приложение в фоне или устройство в спящем режиме.
Возможные причины проблемы
-
Ограничения iOS по деактивации фонового режима: Несмотря на то, что вы включили режим фоновой активности для VoIP, возможно, что iOS ограничивает определённые типы трафика в фоновом режиме, особенно если они не являются жизненно необходимыми для приложения. Подобные ограничения могут включать задержку или блокировку не критических SIP подробностей.
-
Настройки PushKit: Возможно, PushKit Notifications не достаточно досконально реализованы для обработки определенных SIP пакетов. Вам необходимо убедиться, что уведомления организованы правильно и могут "разбудить" приложение для обработки важного SIP трафика.
-
Пропускная способность сети: В условиях ограниченной пропускной способности или если устройство находится в состоянии ожидания (например, в результате низкой активности пользователя), SIP сообщения могут теряться или блокироваться. Убедитесь, что у вас есть стабильное интернет-соединение.
-
Проблемы с конфигурацией Asterisk: Проверьте конфигурацию на стороне Asterisk, чтобы удостовериться, что сообщения правильно обрабатываются и разрешаются. Возможно, необходимо увеличить таймауты и частоту отправки SIP keep-alive сообщений.
-
Логирование и отладка: Отсутствие логов о неудачных SIP попытках может указывать на проблемы с сетевыми настройками или самими сообщениями. Проверьте сетевой трафик с помощью инструмента анализа пакетов, чтобы удостовериться, что SIP сообщения действительно покидают устройство.
Рекомендованные действия
-
Проверьте настройки PushKit: Убедитесь, что правильно реализованы функции, которые прослушивают и обрабатывают уведомления непосредственно при получении входящего вызова.
-
Оптимизация SIP логики: Пересмотрите ваш код jssip и расчеты SIP сообщений. Возможно, следует изменить стратегию обработки событий SIP.
-
Используйте средства для диагностики: Воспользуйтесь инструментами, такими как Wireshark или Charles Proxy, для захвата и анализа SIP трафика. Это поможет вам различить, в какой момент и где сообщения теряются.
-
Работа с Asterisk: Убедитесь, что Asterisk настроен для обработки входящих сообщений, даже если приложение iOS находится в фоновом режиме. Возможно, потребуется изменить таймауты обработки сообщений или проверок.
-
Мониторинг задержек: Если проблема заключается в задержках сети, рассмотрите возможность оптимизации ваших сетевых соединений или использования альтернативных методов передачи данных.
Заключение
Решение проблемы, с которой вы столкнулись, требует комплексного подхода. Убедитесь, что ваше приложение отвечает требованиям iOS в отношении фоновой работы, оптимизируйте логику обработки SIP сообщений и детально проверьте настройки на стороне Asterisk. Тщательное тестирование и анализ помогут вам устранить эту проблему и обеспечить надежную работу вашего VoIP приложения, даже когда оно находится в фоновом режиме.