Многие приложения для здоровья в России перестали нормально работать. Omron — одно из них. А давление мерить надо каждый день. Поэтому я решил сделать своё iOS-приложение, которое через камеру считывает показания с любого тонометра, сохраняет их и строит графики динамики.

Я Senior CV-инженер — компьютерное зрение моя основная работа. Так что OCR с дисплея тонометра технически не должен был стать проблемой. Но как iOS-разработчик я — полный ноль. Xcode открыл впервые. Swift видел мельком. Это честный рассказ о том, как это выглядит изнутри.

И да, я делаю open source приложение за свободу здоровья от политики — и при этом только под iOS. Ирония не ускользнула. Но это open source — найдётся кто-нибудь с Android-девайсом и свободным вечером ?

Постановка задачи

Приложение должно:

  • Считывать показания (систола / диастола / пульс) с дисплея тонометра через камеру

  • Сохранять историю локально — никакого облака, никаких аккаунтов

  • Показывать график динамики давления за неделю

  • Работать без интернета и без зависимости от внешних сервисов

Последний пункт принципиален: если приложение зависит от чьего-то сервера — оно снова может перестать работать в любой момент.

Выбор стека: почему не React Native

Первый инстинкт — взять React Native, есть небольшой опыт с React. Но после честного разбора вариантов выбор стал очевиден:

SwiftUI + Vision

Flutter

React Native

OCR качество

⭐⭐⭐⭐⭐ нативный Vision

⭐⭐⭐ плагины

⭐⭐⭐ ML Kit

Камера

AVFoundation, прямой доступ

Хорошая

Средняя

Core ML (своя модель)

Нативно

Platform channel

Нативный модуль

Flutter и React Native — кроссплатформенные фреймворки. Но мне нужен только iOS, то есть их главное преимущество просто не нужно. А проигрывают они нативному стеку по самому важному пункту — качеству OCR и доступу к камере.

Итоговый стек:

  • SwiftUI — декларативный UI (оказался очень похож на React концептуально)

  • SwiftData — локальная БД, аналог ORM, никакого SQL

  • Apple Vision framework — on-device OCR через VNRecognizeTextRequest

  • Swift Charts — встроенная визуализация, iOS 16+

  • AVFoundation — прямой доступ к камере (во второй части)

Ноль внешних зависимостей. Ничего не заблокируется.

Архитектура проекта

MVVM — стандартный паттерн для SwiftUI. Логика отделена от UI, каждый слой тестируется независимо.
MVVM — стандартный паттерн для SwiftUI. Логика отделена от UI, каждый слой тестируется независимо.

Модель данных

Аннотация @Model — это как декоратор в Python. Говоришь SwiftData: «сохраняй объекты этого класса в локальную БД автоматически». Никакого SQL, никаких миграций руками.
Аннотация @Model — это как декоратор в Python. Говоришь SwiftData: «сохраняй объекты этого класса в локальную БД автоматически». Никакого SQL, никаких миграций руками.

Главный экран

Концепция простая: по центру — график за последние 7 дней, внизу — карточка с последним измерением, и большая кнопка + для нового считывания.

OCR: валидация важнее распознавания

VNRecognizeTextRequest — готовая Apple-модель, аналог pretrained YOLO. Запускаешь inference, получаешь текст. Но главная проблема OCR на LCD-дисплеях — не распознавание, а ложные срабатывания. Фон, блики, соседние надписи — всё это попадает в результат.

Решение то же, что и в детекции объектов: post-processing с жёсткими ограничениями:

Физиологически невозможные значения отбрасываем сразу — точно как NMS убирает лишние боксы в object detection. Понятно, что это лишь база. Точные параметры и алгоритмы будем настраивать в ходе теста на инференсе.
Физиологически невозможные значения отбрасываем сразу — точно как NMS убирает лишние боксы в object detection. Понятно, что это лишь база. Точные параметры и алгоритмы будем настраивать в ходе теста на инференсе.

За один вечер с нуля на незнакомом языке получили:

  • ✅ Работающая локальная база данных

  • ✅ График систолы и диастолы с линией нормы

  • ✅ Карточка последнего измерения с цветовым индикатором

  • ✅ Весь OCR-сервис с валидацией

    А вот так выглядит первая версия интерфейса
    А вот так выглядит первая версия интерфейса

    Код на GitHub: Alexandr-Shklyaev/bp-tracker

В следующей части подключаем камеру через AVFoundation, строим real-time OCR пайплайн и учим приложение находить ROI с дисплеем тонометра на кадре.

Комментарии (4)


  1. DanielKross
    22.03.2026 12:29

    Еще одна статья как "иишка написала мне приложение, как круто"! Скучно, таких можно писать по 5 за вечер, с иишкой, 10..


    1. WhiteBehemoth
      22.03.2026 12:29

      Мне было нескучно, хотя целевая задача и не актуальна. За потраченную на статью минуту-две, вынес для себя 2 момента:

      1. идея (вроде бы лежащая на поверхности, но не совсем очевидная) - использование OCR с экрана прибора. Пригодится ли? Не знаю. Но идея интересная, её обдумывание может привести к чему-то.

      2. OCR библиотеки могут сильно отличаться по качеству (если я когда-нить решу что-то подобное делать, то буду делать так же через ИИ, ибо стек совсем не мой). Такие моменты в общем - полезны, ибо дают направления, куда смотреть.

      Сейчас ИИ дают колоссальную свободу в написании программ "под себя", этакий DIY в софте. Читаешь чужие проекты - что-то, нет-нет и сам сделаешь.


      1. Alexandr-Shklyaev Автор
        22.03.2026 12:29

        Спасибо, именно за этим и пишу — не «вот готовое решение», а «вот направление куда смотреть». OCR с физических приборов — действительно недооценённая ниша, тонометр это просто удобный личный кейс. Та же логика работает для любых промышленных дисплеев, счётчиков, панелей управления. Во второй части будет сам CV-пайплайн с камерой — там уже детали реализации, а не только выбор стека.


    1. Alexandr-Shklyaev Автор
      22.03.2026 12:29

      Понимаю скепсис — статей «ИИ написал за меня» действительно много. Но здесь немного другой угол: не «смотрите что сгенерировал ChatGPT», а как CV-инженер разбирается в незнакомом стеке и какие решения принимает на каждом шаге — выбор нативного Vision framework вместо ML Kit, валидация OCR через физиологические ограничения вместо чистого regex, архитектурные решения. Во второй части будет реальный CV-пайплайн с AVFoundation и ROI-детекцией — там уже меньше про «ИИ написал» и больше про инженерные решения.