Социальные функции в мобильных приложениях: чат, VoIP, лента и реакции
Добавить чат в приложение — это не «использовать Socket.io и отображать сообщения». Это оффлайн-доступ, отображение истории при плохом соединении, индикаторы печати, статусы прочтения, push-уведомления при закрытом приложении, и всё это должно работать на Android 8 с 512MB RAM без ANR.
Архитектура чата: WebSocket, XMPP, или готовый SDK
WebSocket — протокол, не архитектура. Голый WebSocket без протокола поверх него — это переизобретение велосипеда. Минимум: определить формат сообщений, heartbeat-механизм, reconnection стратегию, очередь неотправленных сообщений при потере соединения.
На практике для продуктовых чатов используем одно из трёх решений:
Готовый чат SDK — SendBird, Stream Chat, Cometchat. Дают UI-компоненты, серверную инфраструктуру, push-уведомления, модерацию. Быстро, надёжно, но vendor lock-in и recurring costs.
Firebase Realtime Database / Firestore — для простых чатов без требований к масштабируемости >100K concurrent users. Realtime Database удобнее для чата (упорядоченные списки сообщений), Firestore — для более структурированных данных. Ограничение: нет встроенного typing indicators и presence — реализуется отдельно через onDisconnect().
Собственный бэкенд с WebSocket — полный контроль, максимальная кастомизация. Технический стек: WebSocket через socket.io (Node.js) или Phoenix Channels (Elixir) + PostgreSQL + Redis для pub/sub. На мобиле: Starscream (iOS Swift), OkHttp WebSocket (Android), socket_io_client (Flutter).
Оффлайн-режим — самая трудоёмкая часть. Сообщения сохраняются в SQLite (iOS: GRDB, Android: Room) с локальным ID, синхронизируются при восстановлении соединения. Конфликты при одновременной отправке разрешаются через vector clock или server-timestamp ordering.
VoIP: CallKit, ConnectionService и WebRTC
VoIP в мобильном приложении — это два разных сценария: выглядеть как телефонный звонок (системный вызов UI) или просто аудио/видео звонок внутри приложения.
CallKit (iOS) позволяет интегрировать VoIP-звонок в системный интерфейс: приложение появляется на Lock Screen как обычный звонок, работает с Bluetooth-гарнитурами, прерывает другие аудио. Реализуется через CXProvider + CXCallController. Плюс: приложение запускается через VoIP push (PKPushKit) даже когда убито — обязательно для получения входящих звонков.
На Android аналог — ConnectionService API. Более сложная интеграция, поведение варьируется между производителями (Xiaomi, Samsung с их battery optimization агрессивно убивают фоновые процессы).
WebRTC — транспортный протокол для peer-to-peer медиа. WebRTC на iOS через GoogleWebRTC pod или нативный RTCPeerConnection. На Flutter — flutter_webrtc. Сигнальный сервер (обмен SDP, ICE candidates) — обычно через тот же WebSocket канал что и чат.
STUN/TURN серверы — обязательная инфраструктура. Без TURN ~15-20% пользователей за симметричным NAT не смогут установить P2P соединение. coturn — open source TURN сервер, Twilio NTS и Metered TURN — managed варианты.
Лента и реакции
Бесконечная лента — UICollectionView с UICollectionViewDiffableDataSource на iOS, LazyColumn с Paging 3 на Android. Pagination через cursor-based подход (не offset) — при вставке новых элементов курсор не сдвигается, offset — сдвигается, пользователь видит дублирующийся контент.
Реакции (эмодзи на сообщения) — технически: каждая реакция — отдельная запись в БД (message_id, user_id, emoji). Агрегация на сервере: GROUP BY emoji. WebSocket-событие reaction_added обновляет счётчик в реальном времени. Анимация появления реакции — через withSpring (Reanimated) или Core Animation spring на iOS.
Push-уведомления для социальных событий: @mention, ответ на комментарий, новый подписчик — всё через APNs (iOS) и FCM (Android). Для rich notifications (с превью медиа) на iOS — Notification Service Extension, который загружает медиа до показа.
| Функция | Готовый SDK | Кастомная реализация |
|---|---|---|
| Базовый чат | SendBird, Stream | WebSocket + Room/GRDB |
| VoIP | Twilio, Agora | WebRTC + CallKit |
| Лента | — | Paging 3 / DiffableDataSource |
| Push для соц. событий | Firebase FCM/APNs | APNs direct |
Сроки: базовый чат с историей и push — 4-6 недель. VoIP звонки с CallKit/ConnectionService — 3-5 недель. Полноценная социальная лента с реакциями, комментариями и уведомлениями — от 3 месяцев.







