Реалізація верифікації документів у мобільному додатку
Користувач знімає паспорт, додаток розпізнає дані — здається просто, доки не зіткнешся з відблисками, кривим кадром і підробками. Ми реалізували KYC-верифікацію для фінтех-додатків і знаємо кожну точку відмови. За 5 років роботи ми провели понад 30 проєктів, де верифікація документів була критичною ланкою. Наш стек — Swift 5.9, Kotlin, Flutter 3.x — дозволяє обрати оптимальну архітектуру під задачу.
Наприклад, для фінтех-стартапу ми впровадили верифікацію за 8 тижнів, що дозволило знизити кількість фрод-заявок на 40% та заощадити понад $9k–13k щомісяця. Зв'яжіться з нами, щоб обговорити ваш проєкт — ми підберемо оптимальне рішення та оцінимо бюджет.
Детекція та якість документа до OCR
Перший етап — переконатися, що документ потрапив у кадр правильно, без відблисків та змазування. Показувати користувачу повідомлення «занадто темно» або «нахиліть телефон» важливіше за хороший OCR — сміття на вході дає сміття на виході.
На iOS для real-time детекції прямокутника документа — Vision.VNDetectRectanglesRequest:
let request = VNDetectRectanglesRequest { request, error in guard let observations = request.results as? [VNRectangleObservation], let doc = observations.first else { return } // Перевіряємо confidence та aspect ratio для паспорта if doc.confidence > 0.9 && isValidDocumentAspectRatio(doc) { // Захоплюємо кадр captureDocument(rect: doc) } } request.minimumConfidence = 0.8 request.minimumAspectRatio = 0.5 Для перевірки відблиску — аналіз яскравості через CIFilter.glassDistortion або кастомний Metal-шейдер. Наявність specular highlights (білі плями на ламінованій поверхні паспорта) — типова причина відмови OCR у ~15% випадків.
На Android — CameraX + MLKit DocumentScanner API (з'явився нещодавно) або OpenCV для детекції прямокутників через Imgproc.findContours.
Як ми вирішуємо проблему верифікації?
Ми комбінуємо on-device OCR та NFC-верифікацію з серверною валідацією. Такий підхід дозволяє відсікти більшість підробок на клієнті, а остаточне рішення приймати на сервері з урахуванням face matching та перевірки цифрових підписів. Наша команда має 5+ років досвіду в мобільній розробці, понад 30 реалізованих проєктів з KYC-верифікацією.
OCR: платформові vs спеціалізовані SDK
Apple Vision (VNRecognizeTextRequest) — хороша якість для латиниці та кирилиці, працює on-device:
let textRequest = VNRecognizeTextRequest { request, _ in let observations = request.results as? [VNRecognizedTextObservation] ?? [] let lines = observations.compactMap { $0.topCandidates(1).first?.string } parseDocumentFields(from: lines) } textRequest.recognitionLevel = .accurate textRequest.recognitionLanguages = ["ru-RU", "en-US"] textRequest.usesLanguageCorrection = true Google ML Kit Text Recognition v2 — на Android, підтримує латиницю, кирилицю, деванагарі та ще кілька скриптів. Працює on-device.
Спеціалізовані SDK: Regula Document Reader, ABBYY Mobile Capture, Scandit. Коштуют грошей, але дають кращу точність на MRZ (Machine Readable Zone) паспортів та розуміють структуру конкретних документів. Regula, наприклад, знає формати паспортів 240+ країн та забезпечує в 3 рази менше помилок на MRZ порівняно з безкоштовними SDK.
| SDK | Платформа | Точність на MRZ | Вартість | Режим роботи |
|---|---|---|---|---|
| Apple Vision | iOS | ~90% | Безкоштовно | On-device |
| Google ML Kit | Android | ~85% | Безкоштовно | On-device |
| Regula Document Reader | iOS/Android | ~99% | Платний | On-device/Cloud |
Apple Vision обробляє текст у 2 рази швидше за Google ML Kit на пристроях A13+.
MRZ: найцінніше
Machine Readable Zone — два рядки з OCR-оптимізованим шрифтом OCR-B у нижній частині паспорта або ID-картки. Саме звідти вилучаються: ім'я, номер документа, дата народження, термін дії, громадянство.
Парсинг MRZ за стандартом ICAO 9303 (реалізація — відкриті бібліотеки NFCPassportReader на iOS або MRZParser на Android):
// MRZ рядок: P<RUSLASTNAME<<FIRSTNAME<<<<<<<<<<<<<<< // Рядок 2: PA1234567<8RUS9001011M2512310<<<<<<<<<6 struct MRZData { let documentNumber: String let lastName: String let firstName: String let nationality: String let dateOfBirth: Date let expiryDate: Date let gender: Character var isChecksumValid: Bool { // Перевірка контрольних цифр за ICAO 9303 validateMRZCheckDigits(line2: rawLine2) } } Контрольні суми в MRZ — простий спосіб перевірити, що дані не пошкоджені при OCR. Якщо checksum не сходиться — перечитати документ, не відправляти на сервер.
NFC-верифікація біометричних паспортів
Нові паспорти (ICAO LDS1) містять NFC-чіп з біометричними даними та цифровим підписом країни-емітента. Читання чіпа — надійніша верифікація ніж OCR.
На iOS (CoreNFC, NFCTagReaderSession):
// Basic Access Control: ключ формується з MRZ let bacKey = BACKey(documentNumber: mrz.documentNumber, dateOfBirth: mrz.dateOfBirth, dateOfExpiry: mrz.expiryDate) let nfcReader = NFCPassportReader() nfcReader.readPassport(mrzKey: bacKey.key, tags: [.DG1, .DG2, .SOD]) { result in switch result { case .success(let passport): let photo = passport.passportImage // UIImage з DG2 let isValid = passport.documentSigned // перевірка сертифіката CSCA case .failure(let error): handleNFCError(error) } } NFC доступний лише на фізичних пристроях, iPhone 7+. На Android — NfcAdapter з PACE/BAC.
Чому важлива серверна валідація?
OCR-дані з клієнта — завжди недовірені. Фінальна верифікація відбувається на сервері: порівняння фото документа з селфі користувача через face matching API (Amazon Rekognition, Azure Face, або ГАРАНТ/Паспорт-сервіс для російських документів). Серверна перевірка дозволяє відсікти цифрові підробки та гарантує юридичну значущість даних.
Що входить до нашої роботи
- Аудит ваших вимог та вибір оптимального стеку (SDK, платформа, серверна частина).
- Реалізація capture-flow: детекція, контроль якості, захоплення кадру.
- Інтеграція OCR (Apple Vision / ML Kit / спеціалізовані) та парсинг полів.
- Підключення NFC-верифікації (якщо потрібно).
- Серверна валідація з face matching.
- Тестування на колекції з 100+ реальних документів різної якості.
- Документація та рекомендації щодо підтримки.
Процес роботи
- Аналітика: визначення типів документів та країн.
- Проектування: архітектура клієнт-сервер, вибір SDK.
- Реалізація: інтеграція детекції, OCR, NFC.
- Тестування: unit, integration, acceptance на реальних даних.
- Деплой: публікація в App Store / Google Play, налаштування серверної частини.
- Підтримка: моніторинг якості OCR, оновлення SDK.
Орієнтири за термінами
Базовий OCR паспорта (MRZ + основні поля) — 1–2 тижні. Повний KYC-flow з NFC, face matching, підтримкою кількох типів документів — 6–10 тижнів. Вартість розраховується індивідуально.
Отримайте консультацію — ми оцінимо ваш проєкт та запропонуємо оптимальне рішення під ключ.







