Зауважимо: коли база продуктів містить неточні дані, а формули КБЖУ дають помилку в 20%, користувачі швидко втрачають довіру. Ми стикалися з проектами, де через невірну інтерпретацію штрихкодів продукти потрапляли не в ті категорії, а синхронізація з HealthKit призводила до дублювання записів. Щоб цього уникнути, ми комбінуємо перевірені API (Open Food Facts, USDA), реалізуємо швидкий сканер штрихкодів за допомогою ML Kit та Vision, та інтегруємо розрахунки з системним HealthKit/Health Connect на рівні нативних фреймворків. Наш досвід — понад 10 проєктів з гарантією точності та стабільності.
На етапі проектування ми обираємо оптимальну базу продуктів. Open Food Facts обробляє запити в 2 рази швидше за USDA завдяки георозподіленим серверам, що економить бюджет на початковому етапі. Порівняємо основні джерела:
| Джерело | Доступ | Якість | Особливості |
|---|---|---|---|
| Open Food Facts | Безкоштовний REST | Добра для глобальних брендів, пропуски для локальних | 3+ млн продуктів, відкрита ліцензія |
| USDA FoodData Central | Безкоштовний API з ключем | Детальна нутрієнтна інформація | Орієнтований на США |
| Локальні бази (власні) | Платний / краудсорсинг | Контрольоване | Підходить для регіональних продуктів |
Локальне кешування популярних продуктів (топ-1000) прискорює пошук. Промах — запит до API. Використовуємо Room/CoreData.
Як працює сканування штрихкоду?
Найшвидший спосіб додати продукт. На iOS — DataScannerViewController (iOS 16+, Vision framework) або AVCaptureMetadataOutput для старих версій. На Android — CameraX + ML Kit BarcodeScanning:
Приклад коду для Android
val options = BarcodeScannerOptions.Builder() .setBarcodeFormats(Barcode.FORMAT_EAN_13, Barcode.FORMAT_EAN_8, Barcode.FORMAT_QR_CODE) .build() val scanner = BarcodeScanning.getClient(options) val imageAnalysis = ImageAnalysis.Builder() .setTargetResolution(Size(1280, 720)) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() imageAnalysis.setAnalyzer(executor) { imageProxy -> val mediaImage = imageProxy.image ?: return@setAnalyzer imageProxy.close() val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) scanner.process(image) .addOnSuccessListener { barcodes -> barcodes.firstOrNull()?.rawValue?.let { barcode -> onBarcodeDetected(barcode) } } .addOnCompleteListener { imageProxy.close() } } Чому важлива інтеграція з HealthKit/Health Connect?
Дані про харчування, збережені в системних сховищах, доступні іншим додаткам і покращують користувацький досвід. На iOS записуємо dietaryEnergyConsumed, dietaryProtein тощо. На Android використовуємо NutritionRecord.
let calorieType = HKQuantityType(.dietaryEnergyConsumed) let calorieSample = HKQuantitySample( type: calorieType, quantity: HKQuantity(unit: .kilocalorie(), doubleValue: 450), start: mealTime, end: mealTime ) healthStore.save(calorieSample) { _, _ in } val nutritionRecord = NutritionRecord( startTime = mealTime, startZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime), endTime = mealTime.plusMinutes(30), endZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime), energy = Energy.kilocalories(450.0), protein = Mass.grams(35.0), totalCarbohydrate = Mass.grams(60.0), totalFat = Mass.grams(15.0), mealType = NutritionRecord.MEAL_TYPE_LUNCH ) healthConnectClient.insertRecords(listOf(nutritionRecord)) Інтеграція потребує уваги до дозволів та правил App Store Review Guidelines (розділ 5.1.1).
Розрахунок КБЖУ: формули та точність
Базові формули:
- BMR (Mifflin-St Jeor): чоловіки:
10 × вага(кг) + 6.25 × зріст(см) − 5 × вік + 5; жінки:10 × вага(кг) + 6.25 × зріст(см) − 5 × вік − 161. Mifflin-St Jeor equation. - TDEE = BMR × коефіцієнт активності (1.2–1.9). Дефіцит/профіцит — цільові калорії мінус TDEE.
- Добова норма БЖУ: білок 1.6–2.2 г/кг, жири 0.8–1.2 г/кг, вуглеводи — решта від загального КБЖУ.
Перевіряйте коректність на тестових даних. Помилки в розрахунках — одна з частих проблем при самостійній реалізації.
Обробка відсутніх продуктів
Якщо продукт не знайдено в базі, можна додати його вручну або через краудсорсинг. Ми реалізуємо механізм зворотного зв'язку: користувач надсилає фото та дані, модератор перевіряє та доповнює базу. Автоматичне розпізнавання по фото за допомогою ML Kit ImageLabeling або Logmeal API допомагає прискорити процес, але точність залежить від якості зображення.
Що входить в роботу
Після підписання договору ми:
- Складаємо технічне завдання з описом усіх сутностей (продукти, прийоми їжі, користувачі) та потоку даних.
- Проектуємо архітектуру модулів (мережа, кеш, UI, Health інтеграція).
- Реалізуємо сканер штрихкодів, ручне введення, розрахунок КБЖУ та синхронізацію.
- Готуємо документацію для API та App Store/Google Play (політика конфіденційності, розділи інструкції).
- Надаємо доступ до репозиторію, CI/CD пайплайну та TestFlight/Google Play Console.
- Проводимо навчання команди замовника роботі з бекендом та метриками.
- Надаємо підтримку протягом 3 місяців після релізу (виправлення критичних багів, доопрацювання під нові ОС).
Розпізнавання їжі по фото (опціонально)
Для визначення продукту по знімку використовуємо ML Kit ImageLabeling (MobileNetV2) або спеціалізовані API. Порівняємо підходи:
| Метод | Точність на стравах | Швидкість | Вартість | Складність інтеграції |
|---|---|---|---|---|
| ML Kit ImageLabeling | 45–55% (загальні об'єкти) | до 200 мс | Безкоштовно | Низька |
| Logmeal API | 92% на 1000+ страв | 800 мс | $0.01/запит | Середня |
| Власна модель (CoreML/TFLite) | >95% при 50+ тис. зображень | 100–300 мс | Витрати на навчання | Висока |
Співставлення результату з базою продуктів — нечіткий пошук по імені категорії.
Етапи розробки трекера калорій
- Аналіз вимог — обираємо API бази продуктів, стек сканера, формули розрахунку.
- Проектування архітектури — модулі, кешування, синхронізація з HealthKit/Health Connect.
- Реалізація — сканер штрихкодів, розрахунок КБЖУ, інтеграція з зовнішніми сервісами.
- Тестування — unit-тести, UI-тести, інтеграційне на відповідність еталонним даним.
- Документація та деплой — підготовка метаданих, реліз в App Store / Google Play.
- Пост-релізна підтримка — моніторинг помилок, доопрацювання під нові версії ОС.
Терміни та вартість
Базовий додаток з ручним введенням, сканером та інтеграцією в HealthKit/Health Connect — 6–10 тижнів. З розпізнаванням їжі по фото та аналітикою — 3–5 місяців. Вартість розраховується індивідуально залежно від складності функцій. Залиште заявку на консультацію — ми підберемо оптимальне рішення під ваш бюджет.
Наш досвід
Понад кілька років на ринку мобільної розробки. Реалізували 10+ проектів з трекінгом здоров'я. Використовуємо сучасний стек: Swift 5.9, Kotlin, Jetpack Compose, Flutter. Сертифікати та ліцензії підтверджують кваліфікацію команди.
Зв'яжіться з нами, щоб обговорити деталі. Ми допоможемо впровадити трекінг калорій у ваш додаток. Замовте розробку — отримайте надійне рішення.







