Представьте: клиент подписывает договор через мобильное приложение, а потом оспаривает подлинность. Без биометрических метаданных такой спор решить невозможно. Мы сталкивались с этим в проекте для финтеха — пришлось дорабатывать подпись с нуля. Наш подход: комбинируем захват траектории с давлением и скоростью, привязываем к хэшу документа и сохраняем аудиторский след. Мобильные приложения всё чаще требуют встроенного модуля рукописной подписи — от банковских документов до медицинских карт. Но иллюзия «просто картинка» опасна: подпись на экране не имеет юридической силы без привязки к личности, документу и времени. Мы решаем эту задачу на уровне 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 дней на обе. Получите консультацию.







