Розробка мобільного додатку для кикшерингу
Самокат стоїть в 50 метрах, додаток показує «заряд 87%», QR-код сканується — і нічого. Блок управління самоката завис, команда розблокування пішла, але підтвердження немає. Користувач сканує повторно, нарешті їде. Гроші списалися двічі. Це не гіпотетичний кейс — це типова ситуація перших версій IoT-команд без ідемпотентності та стану транзакції.
Специфіка кикшерингу порівняно з каршерингом
Самокати — масовий мікромобільний транспорт з дешевими IoT-блоками (Omni, Ninebot, Segway OEM lock). Протокол управління у кожного виробника свій: Segway Lock Protocol, MQTT-based Omni API або власний TCP. На відміну від автомобіля, самокат може опинитися без мережі в момент розблокування — і тут важлива Bluetooth-розблокування як fallback.
BLE-розблокування. Більшість сучасних IoT-замків підтримують BLE поблизу: користувач підходить близько, додаток виявляє пристрій через CBCentralManager (iOS) або BluetoothLeScanner (Android), відправляє зашифрований unlock-пакет прямо на замок без інтернету. Ключ шифрування генерується сервером при початку оренди та передається в додаток заранее — класична схема offline token.
QR та NFC
Сканування QR — найпоширеніший спосіб ідентифікації самоката. AVCaptureSession з AVMetadataObjectTypeQRCode на iOS, CameraX + BarcodeScanner з ML Kit на Android. Важливий момент: не робити scanning overlay через SwiftUI ZStack поверх AVCapturePreviewLayer без явної CALayer z-order — SwiftUI-view створює додатковий CALayer і може перекривати превью камери на деяких моделях iPhone.
NFC як альтернатива QR працює через Core NFC NFCNDEFReaderSession (iOS) або NfcAdapter.enableForegroundDispatch (Android). На iOS читаємо лише в foreground, що обмежує сценарії, але для «прикладу телефон до самоката» достатньо.
Геозони та правила паркування
Оператори кикшерингу співпрацюють з містом: заборонені зони для їзди, зони обов'язкового паркування, платні зони. Це полігони GeoJSON, які додаток скачує при запуску та оновлює в фоні.
Перевірка нахождення точки в полігоні: GMSGeometryContainsLocation (Google Maps) або MKPolygon.contains на iOS. Для Flutter — poly_gon пакет або власна реалізація алгоритму ray casting. При спробі завершити оренду в забороненій зоні — блокуємо дію з указанням найближчого дозволеного паркування.
Важливо: перевірку зон дублюємо на сервері. Клієнт може бути старої версії або взлом.
Карта флоту та кластеризація
При 1000+ самокатах у місті кластеризація обов'язкова. Використовуємо Supercluster (портований для iOS/Android/Flutter) — алгоритм працює на клієнті, швидко перебудовує кластери при зміні zoom. При zoom > 15 переключаємось на окремі іконки з індикатором заряду батареї: зелені (>50%), жовті (20–50%), червоні (<20%).
Оновлення позицій самокатів — WebSocket з серверними подіями або periodic refresh кожні 30 секунд при активному екрані карти. Не оновлюємо координати всього флоту в background — це пустий розхід батареї.
Механіка тарифів
Кикшеринг часто використовує складні тарифи: старт + поминутна оплата + підвищуючий коефіцієнт в години пік. Логіку тарифікації зберігаємо на сервері, в додатку лише відображаємо поточну вартість через WebSocket з оновленням раз в 10 секунд під час поїздки. Не считаємо вартість на клієнті — розходження між тим, що показав клієнт, і тим, що списав сервер, веде до спорів і чарджбеків.
З практики
Кикшеринг-стартап, 400 самокатів в одному місті. Проблема: після оновлення iOS 17 у частини користувачів перестало працювати BLE-сканування — вони отримували помилку «Bluetooth не доступен», хоча BT був включен. Причина: зміна в CBCentralManager state restoration в iOS 17 — якщо додаток не реалізував CBCentralManagerDelegate.centralManager(_:willRestoreState:), при восстановленні state CBManager бросав .unknown замість .poweredOn. Фікс зайняв 2 години після діагностики.
Етапи та строки
- Аудит IoT-блоків самокатів — протокол, BLE-підтримка, API виробника
- Архітектура команд з idempotency та offline BLE fallback
- Розробка карти, QR/NFC, тарифікації, оплати
- Інтеграція з міськими геозонами (GeoJSON від оператора або міського API)
- Публікація
MVP (карта → QR → оренда → оплата → завершення): 10–14 тижнів. Повна платформа з геозонами, BLE, аналітикою операцій: 4–6 місяців. Вартість розраховується індивідуально.







