Розробка поіску по штрих-коду в мобільному додатку
Поіск по штрих-коду — це не просто «отсканував та знайшов». Це пайплайн: захват зображення → розпізнавання → запрос до бекенду або локальної бази → відображення результату. Кожен крок може бути вузьким місцем, та частіше за все проблеми виникають не у сканюванні, а у тому, що відбувається після.
Платформенні можливості для розпізнавання
iOS: AVFoundation з AVMetadataObjectTypeEAN13Code, UPCA, QRCode та іще десятком типів. Або VisionKit — VNDetectBarcodesRequest з VNBarcodeObservation, зручніше для обробки статичних зображень із галереї. DataScannerViewController (iOS 16+) — найпростіший шлях: один клас, вбудований UI, підтримка всіх типів з коробки.
Android: ML Kit Barcode Scanning (com.google.mlkit:barcode-scanning) — працює офлайн, підтримує 1D та 2D коди. Або ZXing — перевірена бібліотека, але значно повільніше за ML Kit на слабих пристроях.
Вибір залежить від мінімальної версії OS та вимог до офлайн-роботи. ML Kit на Android потребує Google Play Services; на пристроях без GMS (Huawei) потрібен bundled model.
Що дійсно складно: поіск, а не сканування
Само сканування — кілька строк коду. Складність у архітектурі поіску:
Дедупліцікація результатів. Камера розпізнає один та той же штрих-код десятки разів на секунду. Без дебаунса запрос уйде на сервер 50 разів до того, як користувач уберує камеру від полиці. Рішення: throttle на останній розпізнаний код з затримкою 800ms-1s.
Офлайн-поіск. Якщо каталог товарів доступний локально, поіск по SQLite або Room (Android) / CoreData (iOS) по полю barcode з індексом працює миттєво. Без індексу на таблиці з 100k товарів — 300-500ms навіть на флагмені.
Невідомий код. Що показувати, якщо штрих-код не знайдено в базі? Fallback на Open Food Facts API, GS1 lookup, або просто повідомлення? Це продуктове рішення, але його потрібно закласти в архітектуру заранее — інакше переробляти flow.
Приклад: поіск з дебаунсом на iOS
private var lastScannedCode: String?
private var searchTimer: Timer?
func handleScannedCode(_ code: String) {
guard code != lastScannedCode else { return }
lastScannedCode = code
searchTimer?.invalidate()
searchTimer = Timer.scheduledTimer(withTimeInterval: 0.8, repeats: false) { [weak self] _ in
self?.performSearch(barcode: code)
}
}
Типи штрих-кодів та їх обробка
| Тип | Застосування | Примітка |
|---|---|---|
| EAN-13 / UPC-A | Рітейлові товари | GS1 стандарт |
| Code 128 | Логістика, склад | Довільний текст |
| QR Code | Посилання, платежі | До 4096 байт |
| Data Matrix | Ліки | Маленький розмір |
| ITF-14 | Групова упаковка | Тільки цифри |
Якщо у техзаданні не вказані конкретні типи — уточнюємо заранее. Включати підтримку всіх типів без необхідності сповільнює розпізнавання.
Строк розробки: 1-3 дні. Вартість розраховується індивідуально після уточнення типів кодів та архітектури поіску.







