Разработка мобильного приложения для управления конференцией
Приложение для конференции живёт коротко — от недели до нескольких дней активного использования. Но именно в этот период нагрузка пиковая: сотни одновременных пользователей синхронно смотрят расписание, ищут залы, сканируют бейджи. Надёжность в реальном времени важнее красивого UI.
Расписание и персонализация
Расписание конференции — сетка по времени и залам. На iOS: UICollectionView с кастомным UICollectionViewLayout, где каждый доклад — это ячейка с позицией (startTime) и размером (duration). Compositional Layout здесь не подходит — нужна полная кастомизация позиционирования. Кастомный layout с prepare() вычисляет UICollectionViewLayoutAttributes для каждого доклада заранее.
На Android — RecyclerView со стандартным LinearLayoutManager и кастомными ItemDecoration не даст нужного результата. Либо кастомный RecyclerView.LayoutManager, либо Compose Canvas для отрисовки сетки расписания напрямую.
Персональное расписание — пользователь добавляет доклады «в закладки». Хранится локально в UserDefaults / SharedPreferences плюс синхронизируется с аккаунтом. Конфликт расписания (два доклада в одно время) — явное предупреждение при добавлении.
Offline-режим обязателен. Конференционный Wi-Fi часто перегружен. Полное расписание кэшируем при первом запуске, обновляем при наличии сети. URLCache для HTTP-ответов с Cache-Control: max-age=300 на сервере. Докладчики могут опаздывать, залы меняться — обновления приходят через push-уведомление с content-available: 1 (silent push) для инвалидации кэша.
Регистрация и бейджи
QR-код для регистрации участника — зашифрованный ticketId в QR. Волонтёры на входе сканируют через AVMetadataMachineReadableCodeObject (iOS) или ML Kit BarcodeScanning (Android). Валидация в реальном времени через API — ответ за < 500 мс даже при 50 одновременных сканированиях.
Кэш валидированных билетов на устройстве сканера: если API недоступен — проверяем по локальной копии. Риск: кто-то может использовать старый билет повторно. Решение — offline cache только для read, запись в сервер при восстановлении связи.
QR-код участника — генерируем в приложении через CoreImage.CIQRCodeGenerator (iOS) или zxing-android-embedded (Android) из ticketId. Высокий уровень коррекции ошибок (CIQRCodeInputCorrectionLevelH) — QR читается даже с царапиной на экране.
Push и live-обновления
Изменения в расписании (перенос доклада, смена зала, отмена) — push в реальном времени. FCM с priority: high для гарантированной доставки. Клиент показывает banner поверх текущего экрана через UIView.animate или snackbar в Compose.
Напоминание за 15 минут до закладок — локальные уведомления через UNUserNotificationCenter. Не Firebase для этого — локальные уведомления работают без интернета. При изменении расписания — перепланируем уведомление: UNUserNotificationCenter.removePendingNotificationRequests(withIdentifiers:) + новый UNNotificationRequest.
Нетворкинг и взаимодействие
Список участников с фильтром по интересам, компании, роли (докладчик, посетитель, спонсор). Обмен контактами — QR-код профиля или NFC через CoreNFC.NFCNDEFReaderSession (iOS) / NfcAdapter.getDefaultAdapter() (Android). NFC для обмена vCard — мгновенно, без камеры.
Чат докладчика с аудиторией — live Q&A. WebSocket канал на доклад, вопросы с upvote. Модератор выбирает вопросы для озвучивания. На сервере: Redis Pub/Sub для broadcast вопросов и голосов всем подключённым клиентам.
Карта конференц-центра
Схема здания — SVG или растровое изображение с наложением интерактивных точек залов. PDFKit (iOS) для векторных планов. Навигация к залу — стрелка с этажом, не полный маршрутный граф (избыточно для одного здания). Indoor Positioning через iBeacon (CLBeaconRegion) для приближения к конкретному залу — опционально, требует наличия beacon-инфраструктуры.
Процесс и сроки
Расписание (сетка + закладки + offline) + push-уведомления + бейджи (QR сканирование) — 6–8 недель. Нетворкинг + чат Q&A + карта + live-обновления — 2–3 месяца. Стоимость рассчитывается после анализа требований.







