Реалізація генерації штрих-кодів у мобільному додатку
Склад просить друкувати етикетки прямо з телефона, роздріб — генерувати QR-чеки офлайн, логістика — створювати Code128 для накладних. Ми справлялися з такими завданнями десятки разів за багато років роботи. Нещодавно клієнт із рітейлу попросив переписати генерацію: їхня попередня бібліотека не підтримувала Code128 з кирилицею, що призводило до нечитабельних штрих-кодів на половині партій. Помилка на етапі вибору бібліотеки перетворює місяці роботи на переписування модуля. Один клієнт заощадив $1.4k–1.9kів на передруку бракованих етикеток після впровадження нашого рішення. Інший — скоротив витрати на логістику на $720–1kів на місяць за рахунок автоматизації генерації кодів для всіх товарів. У цій статті розповімо, які бібліотеки та підходи реально працюють.
Ми використовуємо Swift 5.9, Kotlin 1.9 та Jetpack Compose для сучасних UI. Для старих проектів — UIKit та View System. Завжди дотримуємося Apple Human Interface Guidelines і Material Design.
Які формати штрих-кодів необхідні?
Лінійні коди — EAN-13, UPC-A, Code128, Code39 — відрізняються алгоритмами контрольної суми. EAN-13 обов'язковий для рітейлу, а Code128 — для кур'єрських служб. Двовимірні — QR та Data Matrix.
Порівняння бібліотек
| Формат | iOS | Android | Flutter |
|---|---|---|---|
| EAN-13 | ZXingObjC | ZXing | barcode_widget |
| Code128 | CoreImage (нативно) | ZXing | barcode_widget |
| QR | CoreImage | ZXing | barcode_widget |
| Data Matrix | CoreImage | ZXing | barcode_widget |
ZXing — стандарт для Android, обгортка для iOS. CoreImage швидше, але не вміє EAN. Для Flutter barcode_widget малює через Canvas без нативного коду.
Типові помилки та їхні наслідки
-
Розмиття масштабування: на iOS
CGAffineTransformбез інтерполяції, на AndroidBitmap.createScaledBitmapз фільтром false. Ігнорування цього правила ламає сканування на 30% пристроїв. -
Контрастність: явно задаємо
fgColor/bgColor. Прозорий фон QR не читається при поганому світлі. - Мінімальний розмір QR з корекцією M — 150×150 dp. Ми гарантуємо працездатність на пристроях з 8 Мп камерою.
Як ми реалізуємо генерацію на льоту?
Штрих-коди частіше динамічні: String.format("ORDER-%06d", orderId) → кодування → рендер. Для масової генерації використовуємо фонові потоки (DispatchQueue.global() / Executors.newFixedThreadPool(4)). Виводимо прогрес.
Порівняння продуктивності при генерації 1000 Code128
| Бібліотека | Час (мс) | Чіткість |
|---|---|---|
| ZXing (Android) | 340 | Висока |
| CoreImage (iOS) | 980 | Середня |
| barcode_widget (Flutter) | 720 | Висока |
ZXing генерує Code128 в 3 рази швидше CoreImage при об'ємі 1000+ кодів. Тому для пакетів вибираємо ZXing.
Збереження та друк
Генеруємо Bitmap/UIImage, зберігаємо через FileProvider або UIActivityViewController. Для Bluetooth-принтерів (Zebra ZPL) передаємо ZPL-рядок — чіткість на будь-якому DPI. Важливість цього підходу в тому, що растрові зображення на термопринтерах з низьким DPI перетворюються на пляму.
Чому вибір бібліотеки критичний?
Згідно з документацією Apple, CoreImage підтримує лише деякі формати. Для EAN-13 доводиться використовувати ZXingObjC. На Android ZXing — універсальне рішення, але потребує налаштування ProGuard/R8 для запобігання обфускації класів. Flutter-пакет barcode_widget малює векторні штрих-коди, що дає чіткість на будь-якому масштабі, але поступається швидкістю нативній генерації.
Кирилиця в Code128 — окрема проблема. Кодування Code128 використовує таблиці символів A, B, C. Кирилиця не входить в жодну з них — необхідно перекодувати текст в Latin-1 або використовувати Unicode escape. Бібліотека ZXing автоматично вибирає відповідну таблицю, але для Cyrillic даних потрібен ручний флаг. Ми завжди тестуємо на реальних пристроях з російськими штрих-кодами.
Що входить у роботу
- Аналіз форматів і вимог до точності.
- Вибір бібліотеки з урахуванням платформи та офлайн-режиму.
- Реалізація модуля (кодування, рендер, експорт).
- Тестування на 5+ реальних пристроях.
- Інтеграція з принтером або пакетним друком.
- Документація та код-рев'ю.
- Підтримка 2 тижні після здачі.
Строки
Реалізація 2-3 форматів з екраном перегляду та шерінгом — 1 день. З інтеграцією принтера — 2-3 дні. Зв'яжіться з нами для точної оцінки — вартість розраховується індивідуально.
Чому варто довіритися нам?
Багаторічна мобільна розробка, 50+ проектів з інтеграцією штрих-кодів. Відповідність App Store Review Guidelines Section 4.2 та 5.1. Сертифіковані розробники. Замовте розробку модуля генерації — ми вирішимо задачу з першого разу.







