Отметим: когда база продуктов содержит неточные данные, а формулы КБЖУ дают ошибку в 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. Сертификаты и лицензии подтверждают квалификацию команды.
Свяжитесь с нами, чтобы обсудить детали. Мы поможем внедрить трекинг калорий в ваше приложение. Закажите разработку — получите надёжное решение.







