Альтернатива Lovable под названием Anything
Ранее инструмент Lovable применялся для создания веб-приложений, однако для разработки мобильных приложений он пока не подходит.
Существуют альтернативы Lovable в сфере создания приложений. Недавно был обнаружен инструмент Anything, и учитывая положительный опыт с Lovable, было решено протестировать его для разработки приложения. Поначалу он функционировал приемлемо, но в целом процесс оказался не таким эффективным, как ожидалось.
Наиболее сложным аспектом стало отсутствие возможности немедленного тестирования изменений, исправлений и улучшений. Anything предлагает встроенный интерфейс для тестирования, но он не обеспечивает плавного опыта. Кроме того, инструмент рекомендует проверять код через приложение Expo, однако это тоже не сработало должным образом.
Стоит отметить, что никакого предыдущего опыта в разработке приложений не было. Для разработчиков или людей с базовыми знаниями программирования Anything, вероятно, мог бы стать более продуктивным средством, чем в данном случае.
Код был экспортирован из Anything, после чего попытка запуска в Xcode на Mac привела к множеству ошибок, и приложение не удалось запустить. В итоге выбор пал на другой вариант, и Cursor показался наиболее подходящим.
Инструмент Cursor
О Cursor отзывались положительно многие знакомые, активно использующие его. Решено было самостоятельно проверить этот инструмент.
В Cursor был введен тот же запрос для создания приложения. Затем в Xcode был сформирован проект с использованием папок и файлов, сгенерированных Cursor. Симулятор Xcode запустился, и приложение сработало с первого раза.
Приложение Brush Tracker предназначено для поддержания регулярности ежедневной чистки зубов. Оно рассчитывает показатель чистоты, начинающийся с 100%. При пропуске дня показатель снижается, а визуализация зубов в приложении приобретает желтоватый оттенок, соответствующий уровню чистоты.

Примечание: Все изображения в этой статье представляют собой скриншоты из приложения Brush Tracker.
Первая версия включала только основную функцию приложения. Такой подход считается наиболее эффективным при использовании ИИ-инструментов для создания продуктов: сначала запустить базовую версию, а затем добавлять функции.
Для проверки основной функции в симуляторе требовалось изменить дату без завершения "сегодняшней чистки", чтобы убедиться, что показатель чистоты падает, а визуализация зубов обновляется корректно.
Cursor предложил изменить дату в симуляторе Xcode, но в современных версиях симулятор больше не имеет настроек даты и времени. В старых версиях Xcode эта опция присутствовала, но теперь ее нет.
В качестве обходного пути дату изменили на самом Mac, что повлияло и на симулятор, позволив протестировать функцию.
Было замечено, что при изменении даты на Mac Cursor потерял доступ к аккаунту и перестал работать. После возврата даты на автоматический режим все нормализовалось.
Функция таймера
Встроенный таймер для чистки зубов стал отличным дополнением к Brush Tracker. Пользователи могут просто отметить сессию чистки как завершенную или запустить таймер во время процедуры.

На реализацию этой функции ушло несколько попыток, чтобы добиться желаемого результата. Просто указать Cursor добавить функцию можно, но эффективность возрастает, если уточнить запрос и подробно описать требования. При четких инструкциях Cursor обычно справляется отлично.
Функция вознаграждения
Для дополнительной мотивации после завершения ежедневных чисток была добавлена функция вознаграждения. По окончании сессий пользователь может нажать "Получить ежедневное вознаграждение" и увидеть короткую мотивирующую цитату. Это небольшая деталь, но приятное напоминание о заботе о здоровье зубов.

Обучение во время "виб-кодирования"
Cursor не только генерирует код, но и способствует обучению. При добавлении функции вознаграждения первоначальная реализация оказалась неверной, и функция не работала должным образом.
После описания проблемы Cursor объяснил ее причину и способ исправления. Вот два примера, как Cursor помогает в процессе обучения:
Проблема в том, что rewardQuote пустая при первом нажатии, поскольку handleRewardTap() устанавливает ее, но лист отображается сразу. Необходимо гарантировать, что цитата установлена до показа листа.
Проблема исправлена! Вызов в том, что showReward = true устанавливается сразу после rewardQuote, но в SwiftUI представление листа может произойти до полной обработки обновления состояния.
Эффективное использование Cursor
Cursor — отличный инструмент, но его можно оптимизировать для большей эффективности.
Предположим, код не работает или выполняется некорректно. Если известна проблемная часть, выделите ее и добавьте в чат. Это упрощает Cursor исправление ошибки.
В Brush Tracker возникли трудности с настройкой уведомлений. Проблема была описана, и Cursor заявил об исправлении, но ошибка осталась. Затем из изменений кода была выявлена точка сбоя, и этот фрагмент добавили в чат.
Cursor исправил ее с первой последующей попытки: Проблема в том, что onTapGesture применяется к Picker, но в SwiftUI сегментированные пикеры не всегда хорошо реагируют на жесты касания из-за собственной внутренней обработки. Модификатор onChange срабатывает только при реальном изменении выбора, а не при повторном нажатии на то же значение.
Еще один важный аспект — процент "использованного контекста" в Cursor. Он автоматически захватывает релевантный контекст из кодовой базы, избавляя от необходимости указывать файлы. Однако история чата тоже входит в контекст, и иногда она содержит старые проблемы или нерелевантный код.
Такой лишний шум может увеличить расход токенов или снизить эффективность Cursor. Когда процент использованного контекста растет, рекомендуется очистить историю чата.
Распространение приложения в App Store
После завершения тестирования приложения в симуляторе или на реальном устройстве (например, собственном iPhone) наступает этап распространения в App Store, чтобы другие могли увидеть и использовать его.
Процесс несложный, но включает множество деталей, которые могут занять время, особенно при первом опыте. Доступны ресурсы, подробно объясняющие шаги по публикации.
После выполнения всех шагов приложение было отправлено на проверку. По одобрении пришло уведомление от App Store Connect о готовности к распространению.