Разработка мобильного приложения для велосипедистов
Мы создаём велоприложения под ключ с нуля — от GPS-трекинга до интеграции с датчиками и публикации в App Store и Google Play. За 5 лет мы реализовали 50+ проектов для спортивных стартапов и велоклубов. Наш подход начинается с анализа ниши: почему пользователь выберет ваше приложение вместо Strava или Komoot? Ответ — в уникальной модели данных, оптимизированной под конкретный сценарий. Гарантируем приём в App Store с первого раза, строго следуя Guideline 5.1 (конфиденциальность) и 4.2 (минимальная функциональность).
Какие проблемы решаем
Шум GPS в городских условиях
Сырой трек без фильтрации — это дерганая линия и завышенный пробег на 15-20%. Фильтр Калмана отсекает выбросы и сглаживает траекторию, повышая точность до 20%.
Подключение BLE-датчиков
Пользователи хотят видеть каденс, мощность и пульс в реальном времени. BLE-профиль CSC (Cycling Speed and Cadence) — стандарт, но его парсинг требует учёта флагов единиц измерения. Поддерживаем до 8 одновременных BLE-соединений с задержкой отображения данных менее 50 мс.
Офлайн-навигация и пошаговые подсказки
В горах связь пропадает, а карта должна быть. Загружаем регион в формате mbtiles, голосовые подсказки срабатывают за 150-200 м до поворота через AVSpeechSynthesizer или TextToSpeech.
Как решить проблему шума GPS?
Фильтр Калмана — стандартный подход. Простой алгоритм сглаживания для GPS:
class GPSKalmanFilter {
private var latitude: Double = 0
private var longitude: Double = 0
private var variance: Double = -1
private let minAccuracy: Double = 1.0
mutating func process(lat: Double, lon: Double, accuracy: Double, timestamp: TimeInterval) -> CLLocationCoordinate2D {
let accuracy = max(accuracy, minAccuracy)
if variance < 0 {
latitude = lat; longitude = lon
variance = accuracy * accuracy
} else {
let timeStep = timestamp - lastTimestamp
if timeStep > 0 {
variance += timeStep * 3.0 // Q: process noise
}
let K = variance / (variance + accuracy * accuracy)
latitude += K * (lat - latitude)
longitude += K * (lon - longitude)
variance = (1 - K) * variance
}
lastTimestamp = timestamp
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
}
Дополнительно: точки с horizontalAccuracy > 50 метров отбрасываем полностью. Скачок более 10 м/с (36 км/ч) при ожидаемой скорости 25 км/ч — тоже выброс. Это даёт трек, близкий к реальности. Фильтр снижает ошибку позиционирования на 20% по сравнению с сырыми данными. Apple Core Location Documentation
Как интегрировать BLE-датчики без ANT+ на iOS?
ANT+ на iOS недоступен из App Store (только через MFi-аксессуары). На Android — библиотека ant-android-sdk-stub через Ant+ Plugin Service. Реалистичная альтернатива — BLE-датчики с двойной трансляцией ANT+/BLE (Garmin, Wahoo, большинство современных датчиков). Сравнение протоколов приведено в таблице ниже.
// Android: подписка на Cycling Speed and Cadence (CSC) GATT
val CSC_SERVICE = UUID.fromString("00001816-0000-1000-8000-00805f9b34fb")
val CSC_MEASUREMENT = UUID.fromString("00002a5b-0000-1000-8000-00805f9b34fb")
fun parseCscMeasurement(value: ByteArray): CscData {
val flags = value[0].toInt()
var offset = 1
var wheelRevolutions = 0L
var wheelEventTime = 0
if (flags and 0x01 != 0) { // Wheel Revolution Data present
wheelRevolutions = value.getLong32(offset)
wheelEventTime = value.getUInt16(offset + 4)
offset += 6
}
var crankRevolutions = 0
var crankEventTime = 0
if (flags and 0x02 != 0) { // Crank Revolution Data present
crankRevolutions = value.getUInt16(offset)
crankEventTime = value.getUInt16(offset + 2)
}
return CscData(wheelRevolutions, wheelEventTime, crankRevolutions, crankEventTime)
}
Скорость из CSC считается по дельте оборотов колеса и дельте времени события. Длина окружности колеса — настройка пользователя или автовычисление по размеру шины.
| Характеристика | BLE | ANT+ |
|---|---|---|
| Задержка передачи | 5-15 мс | 1-5 мс |
| Энергопотребление | Среднее | Низкое |
| Поддерживаемые датчики | CSC, HR, Power, Speed, Cadence | Аналогичные + больше вариантов |
| Доступность на iOS | Да (CoreBluetooth) | Нет (только MFi) |
| Доступность на Android | Да (Android BLE) | Да (через plugin) |
Для кроссплатформенных проектов используем BLE как универсальное решение: экономия до 40% бюджета за счёт единого стека на обеих платформах.
Навигация по маршруту
Построение маршрута по велодорожкам — OpenStreetMap через OSRM или GraphHopper с велосипедным профилем. Отображение — MapLibre GL (открытый) или Mapbox SDK. Пошаговая навигация голосом: AVSpeechSynthesizer на iOS, TextToSpeech на Android — триггер за 150-200 метров до поворота. Офлайн-карты критичны для велотуризма в горах. Mbtiles или PMTiles формат, загрузка региона заранее. MapLibre поддерживает офлайн из коробки.
Статистика и интеграция
После поездки: пробег, время, набор высоты (из CLLocationManager.altitude с барометрической коррекцией на iOS, аналогично через SensorManager на Android), средняя/максимальная скорость, мощность, каденс. Экспорт в .fit (формат Garmin/Strava) или GPX. Интеграция со Strava через OAuth2 + Strava API v3: загрузка активности через POST /uploads с файлом .fit или .gpx. Конечная точка поддерживает multipart/form-data с полями data_type, name, activity_type.
Процесс работы
- Аналитика. Изучаем нишу, целевую аудиторию и конкурентов. Определяем уникальное торговое предложение.
- Проектирование. Архитектура приложения (Clean Architecture/REDUX), прототип UI через SwiftUI Preview или Jetpack Compose Preview.
- Реализация. Пишем код по спринтам, каждые 2 недели демо для заказчика.
- Тестирование. Unit-тесты, интеграционные тесты (XCTest/JUnit), тестирование на реальных устройствах с датчиками.
- Деплой. Публикация в App Store через TestFlight и Google Play через Internal Testing.
- Сопровождение. Мониторинг крашей (Firebase Crashlytics), обновление под новые версии iOS/Android, поддержка 3 месяца.
Сравнение подходов: iOS vs Android для GPS-трекинга
| Критерий | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| GPS-провайдер | CLLocationManager | Fused Location Provider |
| Фоновая активность | Always Authorization + allowsBackgroundLocationUpdates | Foreground Service + ACCESS_BACKGROUND_LOCATION |
| BLE-стек | CoreBluetooth (BLE), ANT+ недоступен | Android BLE API, ANT+ через plugin |
| Навигация | MapKit или MapLibre | MapLibre или Maps SDK |
| Офлайн | MapKit с кэшем или MapLibre | MapLibre с кэшем |
| Срок разработки | от 8 до 12 недель | от 8 до 12 недель |
BLE лучше ANT+ в iOS по доступности, но ANT+ даёт меньше задержек на Android. Для кроссплатформенных проектов используем Flutter — он позволяет переиспользовать 80% кода, экономя до 40% бюджета.
Почему выбирают нас
- Опыт: более 5 лет разработки спортивных приложений, 50+ реализованных проектов.
- Сертификаты: наши инженеры имеют сертификаты от Apple и Google (Apple Certified iOS Developer, Google Associate Android Developer).
- Гарантия: принимаем приложения в магазины с первого раза — следуем гайдлайнам App Store Review (4.2, 5.1) и Google Play Policy.
- Прозрачность: каждые 2 недели демо и отчёт о проделанной работе.
Что входит в работу
- Документация: архитектура приложения, описание API, инструкция по сборке и деплою.
- Исходный код: приватный репозиторий GitHub с настроенным CI/CD (GitHub Actions/Xcode Cloud/Android Build).
- Доступы: TestFlight для iOS, Firebase App Distribution для Android, консоли разработчика.
- Обучение: документация и колл для команды поддержки.
- Гарантия: исправление багов в течение 3 месяцев после релиза.
Чек-лист для подготовки к разработке
- Определён основной функционал (GPS, датчики, офлайн-карты)
- Выбрана платформа: iOS, Android или обе (кроссплатформа)
- Проработан уникальный функционал, отличающий от конкурентов
- Подготовлены иконки, бренд-материалы (App Store/Google Play)
- Согласован бюджет и сроки
Свяжитесь с нами для обсуждения вашего проекта — оценим задачу за 2-3 рабочих дня и предложим оптимальное решение. Закажите разработку велоприложения и получите тестовую версию для тестирования в течение двух дней.







