Экспертиза · Мобильные приложения
Приложения для телефона, построенные так, чтобы логику можно было проверить без телефона.
Мы создаём нативные приложения iOS на Swift, с датчиками и HealthKit, а также приложения с одним кодом для iOS, Android и web, когда проект не требует датчиков. Ядро логики тестируется отдельно от экрана.
Уже построеноЭто три собственные реализации, а не одна. Репозиторий с пятью целями приложения (четыре iOS и одна macOS), определёнными в `project.yml`, логические тесты которого мы сегодня прогнали: 160 из 160 проходят. Второе iOS-приложение, в другом проекте, с 40 файлами Swift и HealthKit. И третье направление, с одним кодом для iOS, Android и web, чья web-версия отвечает сегодня. Оговорка, которая меняет ответ на вопрос, который любой покупатель задаёт прежде всего: ни одно из наших приложений не опубликовано в App Store или Google Play. Причина одна и имеет имя — `DEVELOPMENT_TEAM` пуст в конфигурации проекта, то есть отсутствует идентификатор команды из Apple Developer Program. Машина имеет действительную подпись, достаточную для установки на собственное устройство, но недостаточную для распространения в магазине. Это проблема аккаунта, а не кода, но она остаётся проблемой, и мы пишем это здесь, а не внизу.
У мобильного приложения есть две части, которые ломаются по-разному. Часть, которая читает сенсоры и что-то вычисляет — угол, счёт, состояние — и часть, которая рисует экраны. Мы держим их отдельно, и не по эстетическим причинам: в нашем основном iOS-репозитории файлы ядра не импортируют интерфейс, поэтому их можно компилировать напрямую с `swiftc` на Mac и запускать как обычную программу, без симулятора и без телефона. Набор содержит 160 проверок, сгруппированных в 16 этапов; мы запускали его сегодня, и он проходит полностью. Это и есть причина, по которой мы можем сказать, что именно делает алгоритм, а не говорить, что он «хорошо работает».
На iOS мы работаем на Swift 6, с минимальной целью iOS 17. Тот же репозиторий определяет пять приложений как отдельные цели: четыре для iPhone и одно для macOS, а macOS-версия повторно использует пятнадцать файлов из ядра iOS-версии без копирования. Сензоры читаются у источника: интерфейс Apple для сенсоров в наушниках показывает ориентацию головы, а приложение сравнивает текущий угол с положением, которое пользователь калибрует в начале сессии. Пороговые значения — это не «внутренние настройки»: ниже 7° — прямо, между 7° и 13° — смещение, выше 13° в течение трёх секунд запускает тревогу, а сглаживание использует экспоненциальное среднее с коэффициентом 0,15. Все четыре значения находятся в четырёх последовательных строках кода и могут быть показаны.
Когда проекту не нужны сенсоры, мы не рекомендуем native. Третье направление в портфолио — один код, который компилируется для iPhone, Android и браузера — React Native с Expo — а web-версия опубликована и отвечает уже сегодня. Практическая разница для клиента: один опросник, один калькулятор или одна панель не оправдывают две команды и два репозитория; приложение, которое слушает сенсор с частотой двадцать измерений в секунду, — да.
Что мы пока не можем. Ни одно наше приложение нет в App Store или Google Play. Не потому, что оно не компилируется — компилируется, устанавливается на симулятор и проходит тесты, — а потому, что в конфигурации проекта идентификатор команды Apple пустой, то есть нет записи в Apple Developer Program, связанной с этими сборками. На Mac есть действующая подписная идентификация, типа development, которой достаточно для установки на собственное устройство и недостаточно для магазина. Для клиентского проекта аккаунт разработчика открывается на фирму клиента и остаётся его — это вопрос, который нужно обсуждать в начале, а не в конце.