Разработка мобильного приложения для кикшеринга
Самокат стоит в 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 package или собственная реализация алгоритма ray casting. При попытке завершить аренду в запрещённой зоне — блокируем действие с указанием ближайшей разрешённой парковки.
Важно: проверку зон дублируем на сервере. Клиент может быть старой версии или взломан.
Карта флота и кластеризация
При 1000+ самокатах в городе кластеризация обязательна. Используем Supercluster (порт для iOS/Android/Flutter) — алгоритм работает на клиенте, быстро перестраивает кластеры при изменении зума. При зуме > 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 месяцев. Стоимость рассчитывается индивидуально.







