Реалізація верифікації документів у мобільному додатку
Користувач знімає паспорт, додаток розпізнає дані — здається просто, доки не зіткнешся з відблисками, кривим кадром і підробками. Ми реалізували KYC-верифікацію для фінтех-додатків і знаємо кожну точку відмови. За 5 років роботи ми провели понад 30 проєктів, де верифікація документів була критичною ланкою. Наш стек — Swift 5.9, Kotlin, Flutter 3.x — дозволяє обрати оптимальну архітектуру під задачу.
Наприклад, для фінтех-стартапу ми впровадили верифікацію за 8 тижнів, що дозволило знизити кількість фрод-заявок на 40% та заощадити понад 1 000 000 ₽ щомісяця. Зв'яжіться з нами, щоб обговорити ваш проєкт — ми підберемо оптимальне рішення та оцінимо бюджет.
Детекція та якість документа до 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 тижнів. Вартість розраховується індивідуально.
Отримайте консультацію — ми оцінимо ваш проєкт та запропонуємо оптимальне рішення під ключ.







