В нашей практике нередки случаи, когда самокат стоит в 50 метрах, приложение показывает «заряд 87%», QR-код сканируется — и ничего. Блок управления самоката завис, команда разблокировки ушла, но подтверждения нет. Пользователь сканирует повторно, наконец едет. Деньги списались дважды — средний убыток 200 рублей на пользователя. Это не гипотетический кейс — это типичная ситуация первых версий 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 секунд во время поездки. Не считаем стоимость на клиенте — расхождение между тем, что показал клиент, и тем, что списал сервер, ведёт к спорам и чарджбэкам. Средняя стоимость одной поездки — 150 рублей, а неудачная разблокировка обходится оператору в 10 рублей потерянного времени и потенциального ухода клиента. Наши решения прошли сертификацию безопасности платежей (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 недели.
Сроки уточняются после анализа вашего стека. Получите консультацию по вашему проекту. Свяжитесь с нами для оценки — гарантируем прозрачное ценообразование и фиксацию бюджета до старта.







