Для технических специалистов

Предлагаемый стек WhitePhone

Краткое техническое описание для инженеров оператора и АТС. Эталон — публичный Callmar; брендированный контур наследует тот же путь звонка.

Архитектура

iPhone ↔ опциональный relay ↔ ваша SIP / АТС

Медиа идёт к вашей инфраструктуре. Relay нужен для стабильных входящих на iOS, а не как «вторая АТС».

1. iPhone-клиент

Брендированное приложение: CallKit, PushKit, PJSIP, автонастройка.

2. Relay (опция)

OpenSIPS mid_registrar + push-gateway → APNs VoIP.

3. Ваша АТС / SIP

REGISTER, INVITE, кодеки, при необходимости TLS/SRTP.

4. Медиа

RTP/SRTP к вашей стороне по согласованному профилю.

5. Автонастройка

QR / ссылка: с паролем или без — как удобнее оператору.

Relay можно разместить у нас или у вас. Без корректного VoIP push-пути фоновые входящие на iOS нестабильны — это ограничение платформы, не «баг softphone».

Клиент

iOS-клиент на базе Callmar

Платформа iOS 17.0 и новее · iPhone (iPad поддерживается эталоном)
Язык и UI Swift · SwiftUI · локальное хранение на SwiftData
SIP-стек PJSIP / pjproject 2.14.1 (статическая сборка, OpenSSL, Opus)
Телефония Apple CallKit · PushKit (VoIP push для входящих звонков)
Транспорты UDP · TCP · TLS (TLS 1.2+)
Кодеки (предпочтение) Opus 48 kHz · G.722 · Speex WB · G.722.1 · PCMU · PCMA
Шифрование медиа SRTP (SDES), если поддерживает и включает АТС · по умолчанию выключено для совместимости
Эталон продукта Callmar в App Store · callmar.online

Сигналинг и медиа

Стандартный SIP к вашей инфраструктуре

WhitePhone не подменяет АТС. Клиент регистрируется на ваши учётки и ходит INVITE/BYE как обычный SIP UA.

Модель Bring-your-own-SIP: учётные записи оператора / АТС
Операции REGISTER · INVITE · ACK · BYE · перевод звонка (если поддерживает АТС)
Несколько линий Несколько SIP-аккаунтов в одном приложении
NAT Проверяется на пилоте; для фоновых входящих обычно нужен relay (сервер для стабильных входящих)
Примеры совместимости Asterisk · FreePBX · 3CX · FreeSWITCH и другие стандартные SIP; облачные провайдеры по профилю

Не обещаем «любая АТС без проверки». Перед пилотом сверяем конкретный профиль: транспорт, кодеки, TLS/SRTP, несколько устройств, перевод.

Входящие в фоне

VoIP push → CallKit → SIP

На iOS нельзя держать «вечный» UDP REGISTER в фоне. Рабочий путь — APNs VoIP и отчёт в CallKit.

SIP-прокси OpenSIPS 3.6 · модуль mid_registrar (контакты с push)
Push-gateway Python · FastAPI · aioapns · доставка VoIP push в APNs
Цепочка Входящий INVITE на relay → HTTP к gateway → APNs → приложение → CallKit → SIP к вашей АТС
Размещение Наш контур или ваш контур — предмет согласования пилота

Автонастройка

QR и ссылка для быстрой настройки

Параметры аккаунта передаются в payload. Пароль — по желанию оператора: в приложении или сразу в QR/ссылке.

Формат Структурированный payload автонастройки SIP-аккаунта
Каналы QR (JSON) · URL-схема приложения · HTTPS-страница продолжения · URI sip: / sips:
Пароль Можно не включать в QR/ссылку (пользователь вводит в приложении) или включить — если так удобнее вашему процессу
Не входит Universal Links · deferred deep linking · MDM-enrollment как обязательная часть пилота

АТС

Что нужно сверить до пилота

  • SIP REGISTER с вашей стороны и политика нескольких устройств на одну учётку
  • Транспорт: UDP / TCP / TLS и сертификаты, если TLS
  • Набор кодеков и приоритеты (желательно Opus или G.722 + запас G.711)
  • SRTP: нужен ли, какой режим; иначе оставляем выключенным
  • NAT / firewall / SBC и путь входящих при закрытом приложении
  • Перевод звонка (blind / attended), если это продуктовое требование
  • Тестовые места: реальные регистрации, connect, качество на 72 часа и 7 дней

Безопасность и данные

Что остаётся на устройстве, что проходит через сервер

Формулировки для ИБ и архитекторов — без маркетинговых обещаний «всё только на телефоне».

SIP-пароль После настройки хранится в Keychain на устройстве; в QR/ссылке — опционально, по политике оператора
Push-токен Нужен relay/gateway для доставки входящих — это токен уведомлений, не пароль SIP
Медиа звонка К вашей АТС / провайдеру по SIP/RTP; мы не записываем и не храним разговоры на своей стороне
Опция 24/7 relay Если включаете серверный REGISTER, учётные данные могут храниться в зашифрованном хранилище relay — это отдельное согласование, не режим по умолчанию для всех пилотов
ИИ-заметки В публичном Callmar — на устройстве (Apple Speech / WhisperKit). В базовый пилот WhitePhone не входят как готовая функция

Границы

Что в пилоте, что отдельно

Чтобы техкоманда и коммерция смотрели в одну спецификацию.

В пилоте

  • Брендированный iOS-клиент и публикация
  • CallKit · PushKit · стабильные входящие
  • Подключение к вашей SIP / АТС
  • Автонастройка по QR или ссылке
  • Опциональный relay (сервер для стабильных входящих)
  • Тестовые места и контроль качества звонков

Отдельным объёмом

  • Глубокая интеграция ЛК / биллинг / API оператора
  • Android-клиент
  • ИИ-транскрибация и саммари как продуктовая фича
  • MDM / корпоративный каталог приложений
  • Гарантированные сроки App Review

Старт

Что прислать для технического разбора

  • Тип АТС / SBC и версия (или облачный SIP-провайдер)
  • Образец рабочих SIP-реквизитов для теста (можно временная учётка)
  • Нужен ли TLS и SRTP; есть ли требования ИБ к размещению relay
  • Ориентир по числу iPhone-пользователей на пилоте
  • Материалы бренда: имя, иконка, цвета, кто публикует в App Store