Разработка поиска по QR-коду в мобильном приложении
Мы часто сталкиваемся с задачей интеграции сканера QR-кодов в готовое приложение. Казалось бы, библиотек много, но каждая платформа диктует свои правила: на iOS строгие ограничения App Store, на Android — фрагментация устройств и версий. Результат — приложение либо зависает на сканировании, либо неправильно парсит данные. За 5+ лет мы реализовали QR-сканеры в 20+ проектах: от ритейла до медицины, на Swift, Kotlin и Flutter. В этой статье разбираемся, как сделать быстрый, надёжный и модульный QR-сканер с учётом всех нюансов: от выбора фреймворка (Vision vs ML Kit) до корректной маршрутизации по типу данных.
Согласно документации Apple, для использования DataScannerViewController необходимо настроить entitlement и добавить NSCameraUsageDescription. На Android в AndroidManifest.xml требуется разрешение CAMERA. Пропуск этих шагов — одна из самых частых причин падений при первом запуске.
Как быстро реализовать сканирование QR-кода?
Сканирование — лишь первый шаг. iOS 16+ использует DataScannerViewController — одна строка настройки:
let scanner = DataScannerViewController( recognizedDataTypes: [.barcode(symbologies: [.qr])], qualityLevel: .balanced, isHighlightingEnabled: true ) isHighlightingEnabled: true добавляет визуальную подсветку — пользователи это ценят. Для iOS 14–15 потребуется Vision framework: VNDetectBarcodesRequest для фото, AVCaptureMetadataOutput для live видео. На Android используем ML Kit: BarcodeScanning.getClient() с BarcodeScannerOptions. Указываем FORMAT_QR_CODE для оптимизации скорости — если нужны все форматы, фильтр убираем, но скорость чуть падает.
ML Kit на Android обрабатывает QR в 3–5 раз быстрее, чем ZXing, и в 2 раза быстрее Vision на iOS на средних устройствах (данные наших тестов на 10 моделях).
Сравнение подходов iOS и Android
| Параметр | iOS | Android |
|---|---|---|
| Основной фреймворк | DataScannerViewController (iOS 16+) / Vision |
ML Kit BarcodeScanning |
| Дополнительная настройка | Provisioning profile, NSCameraUsageDescription |
AndroidManifest.xml запрос камеры |
| Работа с галереей | PHPicker + Vision |
GetContent + ML Kit |
| Определение типа | Вручную по строке | Встроенное через Barcode.valueType |
| Производительность | Мгновенно (системное) | 50–200 ms на средних устройствах |
Почему парсинг содержимого важнее самого сканирования?
QR-код — это строка. Как с ней поступить — определяет UX.
- Начинается с
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 возвращает сырую строку — тип придётся определять самостоятельно. Для Wi-Fi на iOS требуется com.apple.developer.networking.HotspotConfiguration entitlement — это скрытая сложность.
Типы QR-данных и их обработка
| Тип | Пример содержимого | iOS | Android |
|---|---|---|---|
| URL | https://example.com |
SFSafariViewController | CustomTabs |
| Wi-Fi | WIFI:S:... |
NEHotspotConfiguration | WifiNetworkSuggestion |
| vCard | BEGIN:VCARD... |
CNContactVCardSerialization | VCardReader |
| Кастомный | Любой формат | Ваша логика | Ваша логика |
Работа с галереей: обязательный минимум
Пользователи ожидают, что можно выбрать QR-код из фото, а не только сканировать с камеры. Реализация:
iOS: PHPickerViewController → получаем UIImage → VNDetectBarcodesRequest на CIImage. Работает в фоновом потоке через perform.
Android: ActivityResultContracts.GetContent("image/*") → получаем Uri → InputImage.fromFilePath(context, uri) → BarcodeScanning.getClient().process(inputImage).
Частая ошибка: обработка изображения на main thread. На фото из галереи это блокирует UI на 200–500 ms. Всегда — в фоновый поток. Наш опыт показывает, что пользователь заметит задержку уже с 150 ms.
Процесс разработки под ключ
- Анализ — изучаем ваше приложение, целевую аудиторию, сценарии использования QR.
- Проектирование — выбираем стек (ML Kit vs Vision, реализация маршрутизации), готовим прототип с одним типом кода.
- Реализация — интеграция сканера, парсинг, обработка галереи, deep linking.
- Тестирование — на реальных устройствах с разными версиями ОС, проверка всех форматов QR.
- Деплой — публикация в App Store / Google Play, настройка provisioning profiles.
Что входит в работу
- Исходный код модуля сканирования на Swift / Kotlin / Dart с документированием.
- Интеграция с существующим навигатором приложения.
- Обработка всех распространённых типов QR (URL, Wi-Fi, vCard, кастомные).
- Поддержка галереи.
- Тестирование на 5+ физических устройствах.
- Помощь с публикацией (App Store Connect, Google Play Console).
Сроки ориентировочно
От 3 до 10 рабочих дней в зависимости от сложности маршрутизации и необходимости deep linking. Свяжитесь, чтобы мы оценили ваш проект и рассчитали точную стоимость.
Типичные ошибки при разработке QR-сканера
- Необработка разрешения камеры во время исполнения — приложение падает на iOS, если пользователь отклонил запрос.
- Синхронная обработка изображения на UI потоке — лаги при сканировании из галереи.
- Игнорирование
ATT(App Tracking Transparency) для iOS — бан от App Store. - Отсутствие fallback для старых версий ОС — устаревшие библиотеки не обновляются.
Наш опыт
За 5+ лет мы реализовали QR-сканеры в 20+ приложениях: от ритейла до медицины. Работали с Apple‑сертификатами, ProGuard/R8 shrink, Firebase App Distribution. Есть опыт прохождения ревью App Store с кастомными entitlement. Если у вас специфический кейс — пишите, обсудим.
Экономия времени пользователей на ручном вводе данных составляет до 80% при использовании QR-сканера. Закажите разработку модуля QR-сканера под ключ. Получите консультацию по интеграции и оценку сроков — свяжитесь с нами.







