Чому волонтерам потрібен окремий додаток?
Організації часто намагаються керувати волонтерами через Google Forms і чати. Це призводить до втрати даних: хто прийшов, скільки годин відпрацював. Сотні сповіщень у загальному чаті — волонтери перестають їх читати. Ручний облік займає у координатора до 10 годин на тиждень. В одному проекті для НКО координатор витрачав 12 годин на тиждень на звірку Excel-таблиць — після впровадження додатка цей час скоротився до 30 хвилин. Ми вирішуємо цю проблему за допомогою розробки мобільного додатка для волонтерства, який включає карту заходів, check-in через QR або геолокацію, облік відпрацьованих годин та автоматичну генерацію сертифікатів.
Як організувати геолокацію заходів?
Карта з маркерами заходів — основа. Використовуємо MapKit (iOS) або Google Maps SDK (Android). При 50+ подіях обов'язкова кластеризація: MKAnnotationView з MKClusterAnnotation на iOS, ClusterManager з Maps Utils на Android. Пошук найближчих подій — запит до сервера з параметрами lat, lng, radius. На сервері — PostGIS ST_DWithin() або формула Haversine. Фільтр за категорією, датою, організацією. Геофенсинг для сповіщень про нові заходи в радіусі: CLLocationManager.startMonitoring(for: CLCircularRegion) (iOS) або Geofencing API (Android). Ліміт iOS — 20 регіонів одночасно. Для масштабування динамічно оновлюємо набір регіонів при переміщенні користувача на 500 метрів.
Щоб реалізувати геофенсинг коректно, необхідно враховувати дозволи користувача. Згідно з App Store Review Guidelines, додатки повинні запитувати доступ до геолокації тільки при використанні та пояснювати мету. Ми додаємо екран онбордингу з описом, навіщо потрібна геолокація.
Що дає облік волонтерських годин?
Після check-in години нараховуються автоматично або підтверджуються організатором. У профілі — історія по місяцях і категоріях, сумарно за рік. Наприклад, за 6 місяців волонтер може накопичити 200 годин при щотижневій участі. Сертифікати генеруємо в PDF на сервері (WeasyPrint або Puppeteer), завантаження через URLSession.downloadTask. На iOS відкриваємо через UIActivityViewController — зберегти, роздрукувати або відправити.
Порівняння способів check-in
| Спосіб |
Швидкість |
Надійність |
Вимоги до обладнання |
| QR-код |
<1 сек |
Висока |
Камера смартфона, екран організатора |
| Геолокація |
3–5 сек |
Середня (залежить від GPS) |
Включений GPS |
| Ручна відмітка |
10+ сек |
Висока |
Немає |
QR-код швидше за геолокацію в 2–3 рази, але вимагає контакту. Геолокація зручна на вулиці, але може давати збої в приміщеннях. Комбінуємо обидва методи: на вулиці — геолокація, в залі — QR. Така гнучкість дозволяє охопити 95% сценаріїв.
Які технології використовуємо для різних платформ?
| Компонент |
iOS |
Android |
Крос-платформа |
| UI |
SwiftUI |
Jetpack Compose |
Flutter / React Native |
| Карти |
MapKit |
Google Maps SDK |
flutter_map / react-native-maps |
| Камера (QR) |
AVFoundation |
CameraX |
camera (pub.dev) / react-native-camera |
| Push |
APNs |
FCM |
firebase_messaging / react-native-firebase |
| Зберігання |
CoreData / CloudKit |
Room |
Hive / WatermelonDB |
Для єдиної кодової бази обираємо Flutter або React Native з нативними картами. Якщо важлива продуктивність анімацій та нативний UI — нативний iOS/Android.
Як налаштувати push-сповіщення для волонтерів?
Push-сповіщення — ключовий канал зв'язку. На iOS використовуємо APNs з пріоритетом critical для термінових подій (скасування заходу), на Android — FCM з каналами сповіщень. Токени пристроїв зберігаємо в базі, при відправці фільтруємо за гео та інтересами. Deep linking (Universal Links / App Links) веде прямо на сторінку заходу. Для цього налаштовуємо apple-app-site-association та assetlinks.json. Це дає до 70% переходів зі сповіщень у додаток.
Етапи розробки
- Аналітика: вивчаємо процеси, проектуємо рольову модель (волонтер, організатор), прототипуємо екрани.
- Проектування: налаштовуємо геофенсинг, push (FCM/APNs), deep linking (Universal Links / App Links).
- Реалізація: пишемо код на SwiftUI або Jetpack Compose, інтегруємо карти та камеру.
- Тестування: перевіряємо check-in на 10+ пристроях, навантаження push до 10 000 одночасних.
- Деплой: публікація в App Store та Google Play з урахуванням App Store Review Guidelines (Section 4.2/5.1), Code Signing та provisioning profiles.
Що входить в результат
- Вихідний код з документацією збірки.
- Доступи до App Store Connect / Google Play Console.
- Інтеграція з вашим бекендом (REST/GraphQL) або налаштування Firebase / Supabase.
- CI/CD (GitHub Actions / Bitrise).
- Навчання команди (2 вебінари).
- Технічна підтримка 1 місяць.
Чому обирають нас?
Більше 5 років розробляємо мобільні додатки. Запустили 30+ проектів для НКО та соціальних стартапів. Кожен додаток проходить аудит безпеки (ProGuard/R8, захист від трасування). Гарантуємо відповідність політикам сторів. Середня економія часу координатора після впровадження становить 10 годин на тиждень, що дозволяє значно скоротити витрати. Отримайте консультацію — проаналізуємо вимоги, запропонуємо архітектуру та назвемо терміни за 2 дні. Зв'яжіться з нами вже сьогодні.
Приклад конфігурації геофенсингу на iOS
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 53.9, longitude: 27.56), radius: 100, identifier: "event1")
region.notifyOnEntry = true
region.notifyOnExit = false
locationManager.startMonitoring(for: region)
Ліміт 20 регіонів — оптимізація через динамічне оновлення при зміні міста.
Розробка чатів та соціальних функцій: чат, 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 — оптимально. Ліцензія SendBird для проекту з 10К користувачів — ~$400/міс.
- Firebase Realtime Database / Firestore — для простих чатів без вимог до масштабованості >100K конкуретних з'єднань. 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–3× більше, але zero vendor risk. Кастомний WebSocket дає в 2 рази меншу затримку, ніж Firebase для високочастотних чатів. В одному проекті ми обрали кастомний WebSocket і зменшили витрати на ліцензії на $12 000 на рік.
| Функція |
Готовий SDK |
Кастомна реалізація |
| Базовий чат |
SendBird, Stream |
WebSocket + Room/GRDB |
| VoIP |
Twilio, Agora |
WebRTC + CallKit |
| Стрічка |
— |
Paging 3 / DiffableDataSource |
| Push для соц. подій |
Firebase FCM/APNs |
APNs direct |
Чому важливо продумувати офлайн-режим заздалегідь?
Офлайн-режим — найтрудомісткіша частина чату. Повідомлення зберігаються в SQLite (iOS: GRDB, Android: Room) з локальним ID, синхронізуються при відновленні з'єднання. Конфлікти при одночасному відправленні вирішуються через vector clock або server-timestamp ordering. Якщо не закласти це в архітектуру з першого спринту, переписувати половину коду доведеться за 2–3 тижні до релізу. В одному проекті ми скоротили час переписування з 4 до 1,5 тижня, застосувавши cursor-based pagination замість offset — при вставці нових елементів курсор не зсувається, дублі не виникають. Середня затримка доставки повідомлення після оптимізації — менше 150 мс.
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.
Стрічка та реакції
Нескінченна стрічка — 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-повідомлення для соціальних подій: @згадка, відповідь, новий підписник — через APNs та FCM. Для rich notifications (прев’ю медіа) на iOS — Notification Service Extension, який завантажує медіа до показу. Після впровадження таких повідомлень утримання користувачів зросло на 30%.
Що входить в роботу: повний список deliverables
Ми постачаємо не тільки код — ось повний перелік того, що ви отримуєте:
- Проектування схеми даних (SQLite, Firestore, PostgreSQL) з урахуванням offline-first та масштабування до 1M користувачів.
- Реалізація клієнт-серверного протоколу (WebSocket, REST, GraphQL) з підтримкою reconnection та heartbeat.
- Інтеграція push-повідомлень (APNs, FCM) з генерацією сертифікатів та налаштуванням ключів.
- Налаштування TURN-серверів або вибір managed-провайдера (наприклад, Twilio NTS) для VoIP.
- Документація API та схема міграцій (включаючи rollback-план).
- Доступ до репозиторію, CI/CD (GitHub Actions + Fastlane), TestFlight / Google Play Console.
- Навчання команди (code review перших 2 спринтів) та передача знань.
- On-call підтримка протягом 2 тижнів після релізу.
Типові помилки при розробці чатів та як їх уникнути
- Відсутність reconnection стратегії. Клієнт просто відключається без черги невідправлених повідомлень. Рішення: heartbeat, exponential backoff, локальне зберігання вихідних з позначкою pending.
- Offset пагінація в стрічці. При вставці нових постів користувач бачить дублі. Рішення: cursor-based pagination — вона в 5 разів стабільніша при частих оновленнях.
- Ігнорування 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+.