Розробка мобільного додатка для електронного пропуска
Пластиковий бейдж у проходній — це 2010-й рік. Більшість запитів на розробку Digital Pass зводяться до однієї задачі: бесшовна верифікація сотрудника або відвідувача без фізичного носія. Але за цією простотою скриває серьйозний стек: криптографічно підписані токени, NFC/BLE-комунікація з турніктами, офлайн-режим при втраті зв'язку та відповідність вимогам корпоративної MDM-політики.
Де чаще всього ломается логіка
Найчастіша проблема — додаток показує QR-код, але не гарантує його одноразовість. Статичний QR на екрані телефону можна сфотографувати та передати. Правильне рішення — динамічний TOTP-код поверх підписаного JWT: кожні 30 секунд новий код, сгенерований на основі shared secret, виданого при онбордингу. На сервері перевіряється не сам QR, а підпис токена + часове вікно.
Другий болючий сценарій — NFC-взаємодія з OSDP-контроллерами (Suprema, HID). Якщо додаток написаний без врахування NFCTagReaderSession lifecycle на iOS, читалка втрачає сесію при уході у background. Обходится явним invalidate() та переносом логіки в URLSessionConfiguration.background для silent push, який буджить додаток при поднесенні телефону.
Як ми будуємо такі додатки
Стек залежить від вимог. Якщо важлива лише iOS-аудиторія — Swift + CryptoKit для підпису пропуска, Core NFC для читання/записи, PassKit для Apple Wallet-інтеграції. Якщо потрібен cross-platform — Flutter з flutter_nfc_kit + нативними platform channels для доступу до Secure Enclave на iOS та Android Keystore на Android.
Ключові компоненти:
- Пропуск як Verifiable Credential (VC) за стандартом W3C — JSON-LD документ з DID-підписю емітента. Зручний при інтеграції з зовнішніми СКУД-системами.
- Offline-first зберігання: пропуск шифрується AES-GCM та зберігається в Keychain (iOS) / EncryptedSharedPreferences (Android). Верифікатор на турніктеті працює без інтернету через Bluetooth challenge-response.
- Apple Wallet / Google Wallet: PKPass та Google Wallet Pass API дозволяють розмістити пропуск в нативному кошельку без окремого додатка. Але немає можливості вбудувати динамічний TOTP — лише статичні поля + barcode. Для корпоративних потреб часто робимо власний пропуск в додатку.
Один з реалізованих кейсів: мобільний пропуск для складського комплексу з 12 точками доступу. Кожен читач — BLE-периферійний пристрій. Додаток на Flutter сканує BLE-пристрій, встановлює GATT-з'єднання, надсилає підписаний challenge та отримує grant або deny. Час від поднесення до відповіді — 800–1200 мс. Fallback — QR з TOTP при вимкненому BLE.
Роль MDM та профілів конфігурації
Корпоративний Digital Pass без MDM — уразливість. Якщо пристрій не управляємий, нельзя гарантувати, що додаток не видалений або не клонований. Інтеграція з Apple Configurator / Microsoft Intune дозволяє:
- принудково встановити додаток на пристрої;
- передати конфігурацію (URL бекенду, tenant ID) через Managed App Configuration без хардкода;
- заблокувати screenshot API (
UIScreen.isCaptured→ показуємо порожній екран замість пропуска).
Етапи проекту
Типовий шлях: аудит існуючої СКУД та її API → проектування схеми токенів та протоколу верифікації → розробка мобільного клієнта та сервера верифікації → пілот на одній точці доступу → нагрузочний тест → rollout.
Сроки: від 6 тижнів (QR/TOTP-пропуск без NFC, одна платформа) до 4 місяців (BLE + NFC + Wallet + MDM + дві платформи). Вартість рассчитується індивідуально після аналізу вимог до СКУД та інфраструктури.







