Представьте: клиент подписывает договор через мобильное приложение, а потом оспаривает подлинность. Без биометрических метаданных такой спор решить невозможно. Мы сталкивались с этим в проекте для финтеха — пришлось дорабатывать подпись с нуля. Наш подход: комбинируем захват траектории с давлением и скоростью, привязываем к хэшу документа и сохраняем аудиторский след. Мобильные приложения всё чаще требуют встроенного модуля рукописной подписи — от банковских документов до медицинских карт. Но иллюзия «просто картинка» опасна: подпись на экране не имеет юридической силы без привязки к личности, документу и времени. Мы решаем эту задачу на уровне Android (Kotlin, Jetpack Compose) и iOS (Swift, SwiftUI), используя низкоуровневый захват траектории и биометрические метаданные. Наш опыт — более 10 проектов с интеграцией подписей в документооборот, гарантируем стабильную работу на всех устройствах. Стоимость такого решения окупается за счёт снижения рисков судебных споров.
Захват рукописной подписи
Сбор траектории касания — основа. Нужны не просто координаты touchMove, а весь поток событий с давлением, скоростью и временными метками. Это позволяет воспроизвести подпись анимированно и собрать биометрические метаданные.
Android — низкоуровневый ввод:
override fun onTouchEvent(event: MotionEvent): Boolean { val x = event.x val y = event.y val pressure = event.pressure // 0.0 - 1.0 val timestamp = event.eventTime when (event.action) { MotionEvent.ACTION_DOWN -> startStroke(x, y, pressure, timestamp) MotionEvent.ACTION_MOVE -> { for (i in 0 until event.historySize) { addHistoricalPoint( event.getHistoricalX(i), event.getHistoricalY(i), event.getHistoricalPressure(i), event.getHistoricalEventTime(i) ) } addPoint(x, y, pressure, timestamp) } MotionEvent.ACTION_UP -> endStroke(x, y, pressure, timestamp) } return true } event.historySize критично — между двумя ACTION_MOVE система батчит промежуточные точки. Игнорирование исторических точек даёт угловатые штрихи вместо плавных кривых.
iOS — UIBezierPath с Bezier-сглаживанием:
func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } let currentPoint = touch.location(in: self) let previousPoint = touch.previousLocation(in: self) let force = touch.force / touch.maximumPossibleForce let midPoint = CGPoint( x: (currentPoint.x + previousPoint.x) / 2, y: (currentPoint.y + previousPoint.y) / 2 ) path.addQuadCurve(to: midPoint, controlPoint: previousPoint) setNeedsDisplay() } Для Apple Pencil используем predictedTouches(for:) — без предсказанных точек отклик при 120 Hz воспринимается как запаздывающий.
Переменная толщина линии
Профессиональная подпись выглядит естественно, когда толщина штриха меняется с давлением и скоростью. Математика проста: width = baseWidth + pressure * maxExtraWidth. При высокой скорости — тонкая линия, при медленном движении — толстая.
fun calculateStrokeWidth(pressure: Float, velocity: Float): Float { val pressureComponent = pressure * MAX_PRESSURE_WIDTH val velocityComponent = (1f - velocity.coerceIn(0f, 1f)) * MAX_VELOCITY_WIDTH return BASE_WIDTH + pressureComponent * 0.6f + velocityComponent * 0.4f } Как обеспечить юридическую значимость? — биометрические метаданные
Для усиления юридической силы собираем метаданные процесса подписания:
- Временные метки каждого штриха
- Скорость движения по участкам
- Нажим (если устройство поддерживает)
- Длительность каждого штриха и паузы между ними
- Общее время подписания
Подробнее о сборе метаданных
Каждый штрих фиксируется с точностью до миллисекунды. Используем поведенческую биометрию — уникальный паттерн давления и скорости сложно подделать. Без этих данных подпись — всего лишь PNG.Эти данные хранятся в базе и могут быть использованы при судебном оспаривании подлинности подписи — поведенческая биометрия. Без них подпись — всего лишь PNG.
Привязка к документу
Рисунок подписи сам по себе бесполезен. Нужно:
- Зафиксировать хэш документа до подписания (SHA-256 PDF или текстового содержимого)
- Прикрепить подпись (PNG + метаданные траектории) к этому хэшу
- Сохранить на сервере с timestamp и идентификатором подписанта
- Опционально: встроить подпись в PDF через iText (Java/Android) или PDFKit (iOS)
Серверная запись:
{ "document_hash": "sha256:abc123...", "signer_id": "user-uuid", "signed_at": "timestamp", "ip_address": "1.2.3.4", "device_fingerprint": "...", "signature_image_url": "...", "stroke_data_encrypted": "...", "session_metadata": { "duration_ms": 4200, "stroke_count": 5, "avg_pressure": 0.72 } } Почему не стоит экономить на биометрии? Сравнение подходов
| Критерий | Готовый SDK (SignaturePad и др.) | Кастомная реализация |
|---|---|---|
| Скорость внедрения | 1–2 дня | 3–4 дня |
| Биометрические метаданные | Нет | Полный сбор |
| Переменная толщина с давлением | Ограничено | Настраиваемая |
| Интеграция с PKI | Нет | Возможна |
| Юридическая сила | Только ПЭП | НЭП с аудит-треком |
Готовые SDK оправданы для простых сценариев (ПЭП), но если требуется НЭП с возможностью судебного оспаривания — кастом реализация в 2–3 раза надёжнее.
Дополнительная таблица: данные для аудита
| Параметр | Значение |
|---|---|
| Количество точек на подпись | 500–1500 |
| Размер метаданных | 2–5 КБ |
| Точность времени | ±1 мс |
| Поддерживаемые устройства | iOS 14+, Android 8+ |
PDF интеграция
На iOS: PDFKit + CGContext для рисования подписи поверх страницы PDF. Для профессионального встраивания с AcroForm полями — сторонняя библиотека PSPDFKit или серверный iText через API.
На Android: PdfRenderer для отображения, встраивание — через iText Android или Apache PDFBox.
Важный момент: визуальное встраивание подписи в PDF ≠ цифровая подпись PDF (которая создаётся через PKI). Это разные вещи. Для юридически значимого PDF-документа нужна именно PKI-подпись — рукописная подпись добавляется как дополнительный визуальный элемент.
Что входит в работу
При заказе под ключ вы получаете:
- Компонент рисования подписи для iOS и Android с поддержкой давления и сглаживания
- Серверный модуль привязки к документу (хэш, метаданные, timestamp)
- Интеграцию с PDF (встраивание подписи)
- Документацию по API и примеры интеграции
- Техническую поддержку на 2 недели
Оценку проекта делаем за 1 день. Закажите кастомную реализацию — получите полный контроль над биометрией. Свяжитесь с нами для консультации.
Сроки: 3–4 дня на одну платформу, 5–7 дней на обе. Получите консультацию.







