У нашій практиці нерідкі випадки, коли самокат стоїть за 50 метрів, додаток показує «заряд 87%», QR-код сканується — і нічого. Блок управління самоката завис, команда розблокування пішла, але підтвердження немає. Користувач сканує повторно, нарешті їде. Гроші списалися двічі — середній збиток $2–3ів на користувача. Це не гіпотетичний кейс — це типова ситуація перших версій IoT-команд без ідемпотентності та стану транзакції. Щоб уникнути таких проблем, ми впроваджуємо рішення з першого дня. Оцінимо ваш проект і запропонуємо оптимальну архітектуру.
Чому BLE-розблокування — must-have для кікшерінгу?
Самокати — масовий мікромобільний транспорт з дешевими 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. За нашою статистикою, впровадження BLE fallback знижує кількість невдалих розблокувань на 60%.
Apple Core Bluetooth Programming Guide рекомендує реалізовувати state restoration для коректної обробки фонових завдань — цей нюанс ми враховуємо при проектуванні.
BLE-розблокування швидше QR-сканування в 3 рази за умови, що користувач знаходиться в радіусі 5 метрів. Порівняння методів представлено в таблиці:
| Метод | Дальність | Швидкість | Захист |
|---|---|---|---|
| QR | 0–30 см | ~1 сек | Залежить від кодування |
| NFC | 0–4 см | ~0,3 сек | Апаратна (SE) |
| BLE | 0–10 м | ~0,5–2 сек | Шифрування ключів |
Як реалізувати 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, що обмежує сценарії, але для «приклади телефон до самоката» цілком достатньо.
Які підводні камені при інтеграції IoT-замків?
Протоколи IoT-замків різняться за надійністю та швидкістю. Наприклад, Segway Lock Protocol використовує фіксований ключ, а Omni API — динамічну аутентифікацію через MQTT. Вибір протоколу впливає на архітектуру додатка. Порівняння:
| Протокол | Тип | Ідемпотентність | Складність інтеграції |
|---|---|---|---|
| Segway Lock | Proprietary | Часткова | Низька |
| Omni (MQTT) | Відкритий | Так | Середня |
| TCP-кастом | Власний | Залежить від реалізації | Висока |
Типова помилка — відсутність ідемпотентності при повторних запитах розблокування, що призводить до подвійного списання. Інша часта проблема — неправильна обробка state restoration в BLE, через яку після оновлення iOS додаток перестає бачити Bluetooth. У нашій практиці був кейс: кікшерінг-стартап з 400 самокатами зіткнувся з масовою відмовою BLE після оновлення iOS. Причина — відсутність CBCentralManagerDelegate.centralManager(_:willRestoreState:). Фікс зайняв 2 години. Ми документуємо такі сценарії та включаємо їх у чек-лист тестування.
Геозони та правила парковки: що важливо знати
Оператори кікшерінгу співпрацюють з містом: заборонені зони для їзди, зони обов'язкової парковки, платні зони. Це полігони GeoJSON, які додаток завантажує при запуску та оновлює у фоні. Перевірка знаходження точки в полігоні: GMSGeometryContainsLocation (Google Maps) або MKPolygon.contains на iOS. Для Flutter — poly_gon package або власна реалізація алгоритму ray casting. При спробі завершити оренду в забороненій зоні — блокуємо дію із зазначенням найближчої дозволеної парковки. Важливо: перевірку зон дублюємо на сервері. Клієнт може бути старої версії або зламаний. Наш досвід показує, що серверна валідація запобігає 95% порушень.
Карта флоту та кластеризація: як не загубити самокати
При 1000+ самокатах у місті кластеризація обов'язкова. Використовуємо Supercluster (порт для iOS/Android/Flutter) — алгоритм працює на клієнті, швидко перебудовує кластери при зміні зуму. При зумі > 15 перемикаємося на окремі іконки з індикатором заряду батареї: зелений (>50%), жовтий (20–50%), червоний (<20%). Оновлення позицій самокатів — WebSocket з серверними подіями або periodic refresh кожні 30 секунд при активному екрані карти. Не оновлюємо координати всього флоту в background — це пуста витрата батареї.
Механіка тарифів: де рахувати гроші?
Кікшерінг часто використовує складові тарифи: старт + похвилинна оплата + підвищувальний коефіцієнт у години пік. Логіку тарифікації тримаємо на сервері, в додатку тільки відображаємо поточну вартість через WebSocket з оновленням раз на 10 секунд під час поїздки. Не рахуємо вартість на клієнті — розбіжність між тим, що показав клієнт, і тим, що списав сервер, веде до суперечок і чарджбеків. Середня вартість однієї поїздки — $1–2ів, а невдале розблокування обходиться оператору в $1–1ів втраченого часу та потенційного відходу клієнта. Наші рішення пройшли сертифікацію безпеки платежів (PCI DSS Level 1).
Що входить у роботу
- Аудит IoT-блоків самокатів: протокол, BLE-підтримка, API виробника.
- Архітектура команд з ідемпотентністю та offline BLE fallback.
- Розробка карти, QR/NFC, тарифікації, оплати.
- Інтеграція з міськими геозонами (GeoJSON від оператора або міський API).
- Публікація в App Store і Google Play з дотриманням гайдлайнів (App Store Review Guidelines).
- Технічна документація та навчання команди.
Етапи та терміни
- Аудит IoT-блоків — 1 тиждень.
- Архітектура — 1–2 тижні.
- Розробка MVP (карта → QR → оренда → оплата → завершення) — 8–12 тижнів.
- Інтеграція BLE, геозон, аналітики — +4–6 тижнів.
- Тестування та публікація — 2–4 тижні.
Терміни уточнюються після аналізу вашого стеку. Отримайте консультацію щодо вашого проекту. Зв'яжіться з нами для оцінки — гарантуємо прозоре ціноутворення і фіксацію бюджету до старту.







