Розробка мобільного додатку для управління конференцією
Додаток для конференції живе коротко — від тижня до кількох днів активного використання. Але саме в цей період навантаження пікове: сотні одночасних користувачів синхронно дивляться розпис, шукають зали, сканують бейджі. Надійність в реальному часі важливіша за красивий 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). Валідація в реальному часі < 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 місяці. Вартість розраховується після аналізу вимог.







