Разработка мобильного приложения для медицинской клиники
Медицинское приложение — это не просто "запись к врачу + онлайн-консультации". Это работа в условиях жёстких требований к данным (HIPAA в США, ФЗ-323 и Приказ Минздрава № 965н в России, GDPR в Европе), интеграции с медицинскими информационными системами (МИС) и специфических сценариев, где UX-ошибка может иметь клинические последствия.
Что определяет архитектуру с самого начала
До первой строки кода надо ответить на три вопроса:
Какие персональные данные обрабатываем? ФИО + дата рождения = персональные данные (ПДн) по ФЗ-152. Диагнозы, анализы, история болезни = специальная категория ПДн — требует отдельного согласия и усиленной защиты. HIPAA аналогично выделяет PHI (Protected Health Information). Требования к серверу, шифрованию и хранению принципиально отличаются.
Есть ли телемедицина? Онлайн-консультации в России регулируются Приказом МЗ № 965н. Назначение лечения через видеосвязь требует идентификации пациента с подтверждённой личностью (СНИЛС, паспорт). Это уже KYC-flow. Западные приложения — аналогично: HIPAA требует BAA (Business Associate Agreement) от всех провайдеров видеосвязи.
Интеграция с МИС? 1С:Медицина, МедЭлемент, Archimed+, TeleMed2 — у каждой своя API (или её отсутствие). Нередко интеграция через ФHIR (Fast Healthcare Interoperability Resources) — международный стандарт для обмена медицинскими данными. Или через HL7 v2 — legacy протокол, всё ещё широко используемый.
Архитектура приложения
Типичный набор модулей для клиники:
- Auth — регистрация, верификация личности (СНИЛС / паспорт), биометрический вход.
- Запись — расписание врачей, онлайн-запись на приём, напоминания (Push, СМС).
- Личный кабинет — история приёмов, результаты анализов, рецепты.
- Телемедицина — видеоконсультация, чат с врачом.
- Платежи — эквайринг, оплата страховкой, рассрочка.
- Уведомления — напоминания о приёме, готовность анализов, повторные визиты.
Для Flutter — Clean Architecture с BLoC: отдельные feature-модули (appointment, telemedicine, lab_results), каждый со своим BLoC, Repository и Data source. Зависимости через get_it или Riverpod.
Для React Native — аналогично: Redux Toolkit или Zustand, разбивка по domain features, React Query для server state.
Запись к врачу: не просто calendar picker
Расписание врача — не простой слот-пикер. Реальные сложности:
Загруженность в реальном времени. Слот, доступный 30 секунд назад, может быть занят. Без WebSocket или polling каждые 10–15 секунд — пользователь выберет занятый слот, получит ошибку при подтверждении. Optimistic locking на сервере + информативное сообщение на клиенте ("Этот слот только что заняли, выберите другой").
Предварительная запись vs живая очередь. Некоторые клиники комбинируют обе системы. Мобильное приложение должно это отражать: "Запись на 14:30" и "Живая очередь, сейчас принимают пациента №4 из 7".
Отмена и перенос. Политика отмены (до N часов — бесплатно, позже — штраф). Уведомление за 24 часа с кнопкой "Подтвердить / Перенести / Отменить" прямо в push.
Телемедицина: видеосвязь
Провайдеры видеосвязи для медицины: Daily.co, Twilio Video, Agora, Zoom SDK, Vonage (ex. TokBox). Для HIPAA-compliant: Daily.co Business plan, Twilio HIPAA-eligible. Для российского рынка: проверяем требования хранения данных на серверах в РФ — многие западные провайдеры не подходят.
Интеграция Agora на примере Flutter:
// Flutter — Agora RTC
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
final engine = createAgoraRtcEngine();
await engine.initialize(RtcEngineContext(appId: agoraAppId));
await engine.enableVideo();
await engine.startPreview();
// Получаем token с сервера (не хардкодим!)
final token = await consultationRepository.getAgoraToken(channelId);
await engine.joinChannel(
token: token,
channelId: channelId,
uid: currentUserId,
options: const ChannelMediaOptions(
channelProfile: ChannelProfileType.channelProfileCommunication,
clientRoleType: ClientRoleType.clientRoleBroadcaster,
),
);
Токен Agora генерируется на сервере с временным TTL (15–60 минут). Никогда не используем static token в продакшене — это нарушение безопасности.
UX во время звонка: индикатор качества связи (latency, packet loss), mute / camera toggle, запрос на включение камеры у пациента, countdown таймер консультации, кнопка технической поддержки. Запись звонка (если разрешена) — с явным уведомлением обеих сторон.
Результаты анализов: PDF и структурированные данные
Лаборатории отдают результаты двумя способами: PDF (просто файл) и структурированные данные (HL7, FHIR, JSON через API МИС). Для отображения в приложении нужно оба варианта:
PDF — встраиваем через PDFKit (iOS) или AndroidPdfViewer. Для FHIR DiagnosticReport — парсим и отображаем с референсными значениями и цветовой индикацией (норма / отклонение).
Важно: результаты анализов — специальная категория ПДн. Шифрование на устройстве обязательно. FileProtectionType.completeUnlessOpen (iOS) / EncryptedFile из androidx.security (Android). Нельзя кэшировать без шифрования.
Push-уведомления: медицинская специфика
Напоминания о приёме — за 24 часа и за 2 часа. Push с action buttons: "Подтвердить" / "Перенести" — обрабатываем в UNNotificationResponse (iOS) / NotificationReceiver (Android) без открытия приложения.
Уведомление "Готовы результаты анализов" — чувствительное. В preview (на заблокированном экране) не показываем диагноз — только "Ваши результаты готовы, откройте приложение". Настраивается через UNMutableNotificationContent.interruptionLevel (iOS 15+) и NotificationCompat.PRIORITY_DEFAULT без sensitive content в body.
Платежи
Эквайринг: CloudPayments, Tinkoff Acquiring SDK, Robokassa — для российского рынка. Stripe — для международного. Интеграция Apple Pay и Google Pay обязательна для конверсии.
Облачная касса (ФЗ-54): каждый платёж через приложение должен фискализироваться. Подключаем АТОЛ Онлайн, OFD.ru или аналог — отправляем чек на email/телефон. Без этого — административная ответственность.
Доступность (Accessibility)
Медицинское приложение часто используют пожилые пациенты. Dynamic Type (iOS) и font scaling (Android) — тестируем на максимальном размере текста. VoiceOver / TalkBack — минимальная поддержка обязательна. Кнопки и tap targets — не меньше 44×44pt (iOS HIG).
Безопасность и аудит
Certificate Pinning — обязателен для защиты от MITM атак. TrustKit (iOS) или OkHttp CertificatePinner (Android). Backup pinned certificates — если основной истёк, приложение не потеряет связь без принудительного обновления.
Root/Jailbreak detection — для приложений с PHI. IOSSecuritySuite (iOS), RootBeer (Android). При обнаружении: не блокируем доступ полностью (это агрессивно и неточно), но шифруем дополнительно чувствительный контент.
Audit Log — каждое обращение к медицинским данным логируется (кто, что, когда). Лог хранится на сервере, недоступен для изменения с клиента.
Этапы и сроки
| Этап | Срок |
|---|---|
| Аналитика, архитектура, UX | 3–4 недели |
| Модуль Auth + верификация | 2–3 недели |
| Запись к врачу + расписание | 3–4 недели |
| Личный кабинет + лаборатория | 2–3 недели |
| Телемедицина (видео + чат) | 3–4 недели |
| Платежи + фискализация | 2 недели |
| Интеграция с МИС | 3–6 недель (зависит от МИС) |
| QA, безопасность, публикация | 3–4 недели |
Минимальный MVP (запись + личный кабинет без телемедицины) — 4–5 месяцев. Полноценное приложение с телемедициной и интеграцией с МИС — 7–12 месяцев. Сроки существенно зависят от доступности API со стороны МИС и готовности технической документации.
Стоимость рассчитывается индивидуально после детального аудита требований и анализа существующей инфраструктуры клиники.







