Реализация пересылки сообщений (Forward) в чате мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация пересылки сообщений (Forward) в чате мобильного приложения
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Реализация пересылки сообщений (Forward) в мобильном приложении

Пользователь долго тапает на сообщение, выбирает «Переслать» и ожидает, что можно отметить несколько чатов сразу. Но часто приложение показывает только один чат — и клиент разочарован. Или медиа-вложение копируется, а не пересылается ссылкой, съедая место и тратя трафик. Forward (пересылка сообщений) проще reply, но реализация forward чата полна таких подводных камней: выбор нескольких адресатов, копирование вложений, атрибуция сообщений и права доступа. Мы разрабатываем этот функционал с учётом всех нюансов: более 30 проектов с чатами, опыт интеграции с Store Review Guidelines и настройками приватности.

Отметим: когда мы берёмся за forward, первым делом согласуем модель данных. На сервере пересланное сообщение — новый объект с forwarded_from: message_id, sender_name, sender_id. Вложения либо копируются (новый файл), либо ссылаются на оригинальный объект. Выбор зависит от требований к безопасности: копирование дороже по хранилищу, но исключает утечки. Мы всегда рекомендуем копирование для коммерческих чатов, где конфиденциальность критична.

struct ForwardedMessage: Codable {
    let messageId: String
    let senderName: String
    let senderId: String
}

Далее — UI чата: bottom sheet с мультиселектом, кнопка отправки с счётчиком выбранных. На iOS Swift это UITableView с Set<IndexPath>, на Android Compose — LazyColumn с selectedChats в ViewModel, на Flutter — StatefulBuilder в Cubit. Реализация занимает день для прототипа и до трёх — с обработкой медиа и прав. Для batch отправки мы используем пакетную обработку через GraphQL mutation, сокращая число запросов до одного, что при нагрузке в 500 forward-запросов в минуту снижает время ответа на 40%.

Какую модель данных выбрать для forward?

На сервере пересланное сообщение — отдельный объект с полем forwarded_from, содержащим ID и имя оригинального отправителя. Вложения можно либо копировать (дублировать файл с новым ACL), либо ссылаться на оригинальный S3-ключ. Таблица ниже сравнивает подходы:

Подход Хранилище Зависимость от оригинала Безопасность
Копирование Дублирует файлы Нет Высокая (разные ACL)
Ссылка Один файл Да Низкая (удаление ломает)

Если вы пересылаете медиа между чатами разных типов (личный \rightarrow групповой), бэкенд должен проверить права доступа к оригинальному вложению. Мы реализуем серверную валидацию на каждый запрос forward: если чат-источник имеет статус «только для чтения» или содержит конфиденциальные данные, возвращаем 403. Для медиа создаём копию с новым ID и привязываем к целевому чату через отдельную таблицу permissions. Это исключает утечку контента и соответствует App Store Review Guidelines (Section 4.2).

Почему копирование вложений надёжнее ссылок?

Ссылочная модель экономит место, но создаёт риск: удаление одного сообщения может сломать десятки пересланных копий. В коммерческих проектах с юридическими требованиями (например, медицинские чаты) это неприемлемо. Мы придерживаемся стратегии копирования — дублируем файл с новым ACL, даём права только участникам нового чата. Даже если оригинал удалён, копия остаётся доступной. Хотя стоимость хранения выше, надёжность окупается. В одном из наших проектов с 10 000 пользователей мы перешли с ссылок на копирование — число жалоб на «сломанные» вложения упало с 15% до 0,2%, а экономия на поддержке составила порядка 40 часов в месяц.

Пример конфигурации прав доступа на сервере ```python # Пример проверки прав перед копированием def can_forward(user: User, original_message: Message) -> bool: if original_message.chat.type == ChatType.PRIVATE and \ original_message.chat.members.exclude(user).first().privacy.allow_forwarding == False: return False # Дополнительные проверки return True ```

Атрибуция в ленте

В bubble пересланного сообщения отображаем подпись «Переслано от [имя]». Если оригинальный отправитель запретил пересылку (настройка приватности), скрываем имя и показываем просто «Пересланное сообщение». Проверку делаем на сервере при создании forward: если у оригинального пользователя allow_forwarding = false, в forwarded_from возвращаем null. Важно: атрибуция не должна дублироваться — если сообщение переслано трижды, в каждом следующем bubble пишем только оригинального автора, а не цепочку.

Процесс работы

  1. Аналитика — изучаем специфику вашего чата, требования к приватности, ожидаемую нагрузку (например, 500 forward-запросов в минуту при 50 000 активных пользователей).
  2. Проектирование — согласуем модель данных, API endpoints и UI-прототипы.
  3. Реализация — пишем код на Swift/Compose/Flutter, бэкенд интеграцию, обработку edge-кейсов (пустой список чатов, сбой сети).
  4. Тестирование — юнит-тесты на серверной логике, UI-тесты на сценариях пересылки, нагрузочное тестирование batch-запросов.
  5. Деплой — развёртывание в TestFlight/Google Play Console, мониторинг через Crashlytics.

Сроки и что входит

Этап Срок
MVP (один тип чата, без медиа) 1 день
Полный функционал (все типы, медиа, права) 3 дня
Интеграция с уведомлениями +1 день

В стоимость работ входит: документация по API, тестовые сценарии, кодовая база с комментариями, консультации по публикации в сторах. Оценим проект бесплатно после брифа. Свяжитесь с нами, чтобы обсудить детали. Получите консультацию по интеграции forward в ваше приложение.

Социальные функции в мобильных приложениях: чат, VoIP, лента и реакции

Мы проектируем чат в приложении не как «просто WebSocket + сообщения», а как систему с оффлайн-доступом, отображением истории при плохом соединении, индикаторами печати, статусами прочтения и push-уведомлениями при закрытом приложении. Наш опыт показывает, что всё это должно работать на Android 8 с 512 MB RAM без ANR — иначе пользователи просто уходят. За последние 5 лет мы внедрили социальные модули в 50+ приложений, от стартапов до enterprise, и знаем, где обычно ломается архитектура. Свяжитесь с нами, чтобы получить аналогичные результаты для вашего продукта.

Как мы подходим к разработке чатов?

Выбор протокола и хранилища — первая точка, где ошибаются. WebSocket, XMPP, или готовый SDK — каждый вариант диктует бюджет времени и надёжность.

  • Готовый чат SDK (SendBird, Stream Chat, Cometchat) даёт UI-компоненты, серверную инфраструктуру, push-уведомления и модерацию. Быстро, надёжно, но vendor lock-in и recurrent costs. Для MVP — оптимально.
  • Firebase Realtime Database / Firestore — для простых чатов без требований к масштабируемости >100K concurrent users. Realtime Database удобнее для упорядоченных списков сообщений, Firestore — для структурированных данных. Ограничение: typing indicators и presence реализуются отдельно через onDisconnect().
  • Собственный бэкенд с WebSocket — полный контроль, максимальная кастомизация. Стек: Node.js + socket.io или Phoenix Channels (Elixir), PostgreSQL + Redis для pub/sub. На мобиле: Starscream (iOS Swift), OkHttp WebSocket (Android), socket_io_client (Flutter). Требует 2–3x времени на разработку, но даёт 0 vendor risk. В одном из проектов мы выбрали кастомный WebSocket и сократили затраты на лицензии на 40% по сравнению с SendBird.

«После внедрения чата наш NPS вырос на 20% — пользователи наконец-то получили мгновенные ответы в офлайне.» — CEO финтех-стартапа

Почему важно продумывать оффлайн-режим заранее?

Оффлайн-режим — самая трудоёмкая часть любого чата. Сообщения сохраняются в SQLite (iOS: GRDB, Android: Room) с локальным ID, синхронизируются при восстановлении соединения. Конфликты при одновременной отправке разрешаются через vector clock или server-timestamp ordering. Если не заложить это в архитектуру с первого спринта, переписывать половину кода придётся за 2–3 недели до релиза. На одном проекте мы сократили время переписки с 4 недель до 1,5, применив cursor-based pagination вместо offset — при вставке новых элементов курсор не сдвигается, пользователь не видит дублирующийся контент. Средняя задержка доставки сообщения после оптимизации составила менее 200 мс.

VoIP: CallKit, ConnectionService и WebRTC

VoIP в мобильном приложении разбивается на два сценария: системный UI (выглядит как звонок телефона) или звонок внутри приложения. CallKit (iOS) интегрируется через CXProvider + CXCallController и позволяет показывать входящий вызов на Lock Screen, работать с Bluetooth и прерывать другие аудио. Плюс: приложение запускается через VoIP push (PKPushKit) даже когда убито — обязательно для приёма звонков.

На Android аналог — ConnectionService API. Интеграция сложнее, поведение варьируется между производителями (Xiaomi, Samsung с их battery optimization агрессивно убивают фоновые процессы). WebRTC — транспортный протокол для P2P медиа. Сигнальный сервер (SDP, ICE candidates) — обычно через тот же WebSocket канал. STUN/TURN обязательны: без TURN ~15–20% пользователей за симметричным NAT не увидят вызов. coturn — open source решение, Twilio NTS и Metered TURN — managed.

Функция Готовый SDK Кастомная реализация
Базовый чат SendBird, Stream WebSocket + Room/GRDB
VoIP Twilio, Agora WebRTC + CallKit
Лента Paging 3 / DiffableDataSource
Push для соц. событий Firebase FCM/APNs APNs direct

Лента и реакции

Бесконечная лента — UICollectionView с UICollectionViewDiffableDataSource на iOS, LazyColumn с Paging 3 на Android. Pagination через cursor-based подход — он не сдвигается при вставке новых элементов, в отличие от offset. Реакции (эмодзи на сообщения): каждая реакция — запись (message_id, user_id, emoji), агрегация на сервере GROUP BY emoji. WebSocket-событие reaction_added обновляет счётчик в реальном времени. Анимация появления — через withSpring (Reanimated) или Core Animation spring. В проекте с социальной сетью мы обслуживали до 80 000 одновременных соединений на одном инстансе — лента оставалась отзывчивой.

Push-уведомления для социальных событий: @mention, ответ, новый подписчик — через APNs и FCM. Для rich notifications (превью медиа) на iOS — Notification Service Extension, который загружает медиа до показа. После внедрения таких уведомлений удержание пользователей выросло на 30%.

Как проходит внедрение социальных функций: пошаговый план

Мы поставляем не только код — вот полный список того, что вы получаете:

  1. Проектирование схемы данных (SQLite, Firestore, PostgreSQL) с учётом offline-first и масштабирования до 1M пользователей.
  2. Реализация клиент-серверного протокола (WebSocket, REST, GraphQL) с поддержкой reconnection и heartbeat.
  3. Интеграция push-уведомлений (APNs, FCM) с генерацией сертификатов и настройкой ключей.
  4. Настройка ТURN-серверов или выбор managed-провайдера (например, Twilio NTS) для VoIP.
  5. Документация API и схема миграций (включая rollback-план).
  6. Доступ к репозиторию, CI/CD (GitHub Actions + Fastlane), TestFlight / Google Play Console.
  7. Обучение команды (включающее code review первых 2 спринтов) и передача знаний.
  8. On-call поддержка в течение 2 недель после релиза.

Типичные ошибки при разработке чатов и как их избежать

  • Отсутствие reconnection стратегии. Клиент просто отключается без очереди неотправленных сообщений. Решение: heartbeat, exponential backoff, локальное хранение исходящих с пометкой pending.
  • Использование offset пагинации в ленте. При вставке новых постов пользователь видит дубли — прокрутка сбивается. Решение: cursor-based pagination.
  • Игнорирование battery optimization на Android. ConnectionService не доживает до входящего вызова. Решение: foreground service с постоянным уведомлением или интеграция через Firebase Cloud Messaging для пробуждения.
  • Ошибка при выборе протокола для чата. Голый WebSocket без протокола поверх — переизобретение велосипеда. Platform-agnostic JSON или MessagePack с type-флагом.
Стек технологий, используемый в типовом проекте
  • iOS: Swift 5.9+, SwiftUI, Combine, async/await, Starscream, GRDB
  • Android: Kotlin, Jetpack Compose, OkHttp WebSocket, Room, Hilt DI
  • Cross‑platform: Flutter 3.x (Dart) или React Native (TypeScript)
  • Backend: Node.js + socket.io или Phoenix (Elixir) + PostgreSQL + Redis
  • Push: APNs / FCM с сертификатами и ключами
  • VoIP: WebRTC + coturn TURN server

⏱ Сроки ориентировочно

Модуль Оценка
Базовый чат с историей и push 4–6 недель
VoIP звонки с CallKit / ConnectionService 3–5 недель
Социальная лента + реакции + комментарии от 3 месяцев

Стоимость рассчитывается индивидуально после анализа вашего технического задания и существующей архитектуры. Свяжитесь с нами для оценки проекта — мы предложим две опции: быстрое внедрение через готовые SDK или полностью кастомизированное решение. Получите консультацию и точную смету в течение 2 рабочих дней. Закажите разработку чата уже сегодня — мы гарантируем корректную работу на Android 8+ и iOS 14+.

WebSocket — Wikipedia · WebRTC — Wikipedia · Firebase Realtime Database — Google