Розробка поіску по QR-коду в мобільному додатку
QR-код містить структуровані дані: URL, контакт vCard, Wi-Fi credentials, платіжний запрос. Завдання поіску по QR-коду — це парсинг змісту та маршрутизація до потрібної дії. Реалізація простіша, ніж зі штрих-кодами, але логіка обробки контенту потребує продумування.
Сканування: найкоротший шлях
iOS 16+: DataScannerViewController — системний сканер, потребує одну строку налаштування:
let scanner = DataScannerViewController(
recognizedDataTypes: [.barcode(symbologies: [.qr])],
qualityLevel: .balanced,
isHighlightingEnabled: true
)
isHighlightingEnabled: true додає візуальну підсвітку знайденого коду — користувачі це цінують.
iOS 14-15: VNDetectBarcodesRequest з Vision framework для фото, AVCaptureMetadataOutput для live-відео. Чуть більше коду, але логіка та сама.
Android: ML Kit BarcodeScanning.getClient() з BarcodeScannerOptions — вказуємо FORMAT_QR_CODE для оптимізації швидкості. Якщо потрібні всі формати — убираємо фільтр, але це чуть повільніше.
Парсинг та маршрутизація
QR-код — це строка. Що з ним робити — залежить від змісту:
- Починається з
http://абоhttps://→ відкриваємо вSFSafariViewController/CustomTabs -
WIFI:S:NetworkName;T:WPA;P:password;;→ пропонуємо підключитися до Wi-Fi (на iOS черезNEHotspotConfiguration, на Android черезWifiNetworkSuggestion) -
BEGIN:VCARD→ парсимо черезCNContactVCardSerialization(iOS) абоVCardReader(Android) - Внутрішній формат додатку → кастомна обробка
Регулярки для визначення типу працюють, але хрупко. Краще — ML Kit на Android автоматично визначає тип через Barcode.valueType (URL, WIFI, CONTACT_INFO та ін.). На iOS VNBarcodeObservation.payloadStringValue повертає сиру строку — тип придётся визначати самостійно.
Робота з галереєю
Користувачі очікують, що можна вибрати QR-код із фото в галереї, не тільки сканувати з камери. Реалізація:
iOS: PHPickerViewController → отримуємо UIImage → VNDetectBarcodesRequest на CIImage. Працює синхронно або через perform у фоновому потоці.
Android: ActivityResultContracts.GetContent("image/*") → отримуємо Uri → InputImage.fromFilePath(context, uri) → BarcodeScanning.getClient().process(inputImage).
Частої помилки: обробка зображення на main thread. На фото з галереї це блокує UI на 200-500ms. Завжди — у фоновий потік.
Строк розробки: 1-2 дні. Вартість розраховується індивідуально.







