Розробка мобільного додатку для велосипедистів
Ми створюємо велододатки під ключ з нуля — від GPS-трекінгу до інтеграції з датчиками та публікації в App Store і Google Play. Ми реалізували 50+ проєктів для спортивних стартапів та велоклубів. Наш підхід починається з аналізу ніші: чому користувач обере ваш додаток замість Strava або Komoot? Відповідь — у унікальній моделі даних, оптимізованій під конкретний сценарій. Гарантуємо прийом в App Store з першого разу, строго дотримуючись Guideline 5.1 (конфіденційність) та 4.2 (мінімальна функціональність).
Які проблеми вирішуємо
Шум GPS в міських умовах
Сирий трек без фільтрації — це смикана лінія та завищений пробіг на 15-20%. Фільтр Калмана відсікає викиди та згладжує траєкторію, підвищуючи точність до 20% (у 1.2 рази порівняно з сирими даними).
Підключення BLE-датчиків
Користувачі хочуть бачити каденс, потужність та пульс у реальному часі. BLE-профіль CSC (Cycling Speed and Cadence) — стандарт, але його парсинг вимагає врахування прапорців одиниць вимірювання. Підтримуємо до 8 одночасних BLE-з'єднань із затримкою відображення даних менше 50 мс.
Офлайн-навігація та покрокові підказки
У горах зв'язок зникає, а карта має бути. Завантажуємо регіон у форматі mbtiles, голосові підказки спрацьовують за 150-200 м до повороту через AVSpeechSynthesizer або TextToSpeech.
Як вирішити проблему шуму GPS?
Фільтр Калмана — стандартний підхід. Простий алгоритм згладжування для GPS:
Фільтр Калмана Swift
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, більшість сучасних датчиків). Порівняння протоколів наведено в таблиці нижче.
Код підписки на CSC
// 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% бюджету за рахунок єдиного стеку на обох платформах. Наприклад, замість $30,000 на два окремі стеки ви витрачаєте $18,000, заощаджуючи $12,000.
Навігація по маршруту
Побудова маршруту по велодоріжках — 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% бюджету.
Чому обирають нас
- Досвід: понад 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 робочих дні та запропонуємо оптимальне рішення. Замовте розробку велододатку та отримайте тестову версію для тестування протягом двох днів. Вартість розробки починається від $15,000, а при використанні єдиного BLE-стеку ви заощаджуєте до $12,000.







