Разработка
Чему я научился, создавая My Veggie Garden
История разработчика о SwiftUI, садоводстве и вещах, которые открываются только после запуска проекта.
Недавно я выпустил новое приложение для огородничества под названием My Veggie Garden. Оно создано с использованием SwiftUI, SwiftData и Foundation Models, и это был один из самых вознаграждающих проектов, над которыми я работал. По пути я совершал ошибки, переписывал, упрощал и открыл для себя несколько уроков, которые мне хотелось бы знать раньше.
Если хотите попробовать садоводство, его можно найти здесь:
Вот более личный взгляд на то, чему я научился.
Архитектура — это не просто структура, это ясность
В ранних версиях я держал логику данных близко к месту, где она используется. Всё, что связано с моими моделями овощей, например, расчёт прошедших дней или времени до сбора урожая, находилось в моделях SwiftData. Это делало код выразительным и простым для понимания.
На основе этого я создал несколько сервисов: Location Manager, Veggie Store, Store, Hardiness Zone Service и несколько других. Некоторые из них сохраняли состояние, а другие были простыми помощниками. Внедрение всего через Environment поддерживало чистоту приложения и предсказуемость потока данных. Для разработчика-одиночки предсказуемое поведение — это подарок.
Знай свою аудиторию, а не свой список желаний
Я люблю экспериментировать с новым, поэтому я рассматривал возможность добавления поддержки дополненной реальности, виджетов и даже функций для Watch. Я подумал, что это будет круто. Мои пользователи так не думали. Когда я посмотрел на свой ранний продукт для садоводства и прислушался к отзывам, я понял — люди хотели одного: простого инструмента, который поможет им выращивать овощи и фрукты.
Им нужны были чёткие инструкции по посадке. Им нужны были напоминания. Им нужен был способ организовать свои сады. Никаких ярких функций. Никаких заумных иконок, которым для понимания нужна подпись. Если иконка сбивала людей с толку, я заменял его текстовой подписью.
Ваша аудитория всегда подскажет, что важно, но только если вы готовы слушать.
Отказ от офлайн-поддержки перестроил приложение
Изначально все овощи хранились в SwiftData. С появлением iCloud всё начало рушиться. Овощи синхронизировались несколько раз на разных устройствах, и приложение тормозило. Подозреваю, что сыграли свою роль соединения и размер модели.
В конце концов, я удалил овощи из базы данных и сохранил их в простом наблюдаемом объекте, который инжектировал через Environment. Там около восьмидесяти-девяноста овощей, и они почти не занимают места. Что ещё важнее, приложение сразу стало работать быстрее и легче.
Это также очистило мою модель данных. Теперь я ссылаюсь на овощи по идентификатору, а не встраиваю весь объект.
Иногда удаление функции кажется прогрессом.
Кэширование важнее, чем вы думаете
Поскольку я управляю собственным сервером на ExpressJS, я могу отправлять ответ 304, даже если ничего не изменилось. Одно это уже само по себе сделало приложение более быстрым. Для изображений я использовал Kingfisher, который упростил кеширование.
Небольшие оптимизации, подобные этим, дают свои плоды. Медленные приложения кажутся тяжёлыми, быстрые — заботливыми.
Изменяйте размер фотографий пользователей, и ваше будущее «я» будет вам благодарно
Люди любят прикреплять фотографии своих растений. Но синхронизация изображений в исходном разрешении между устройствами — это медленно и дорого. Я изменяю размер картинок перед синхронизацией, чтобы пользователь видел чёткие изображения, но они не перегружали iCloud. Я всё равно разрешаю им сохранять исходные фотографии в своей библиотеке, чтобы ничего не потерялось.
Не используйте Foundation Models для прогнозирования климатических зон
Одна из основных функций приложения — возможность использовать широту и долготу для определения местной климатической зоны и затем рекомендаций овощей, которые можно сажать в данный момент.
Я попробовал использовать модели Foundation для прогнозирования зоны. Это было интересно, но результат оказался ошибочным. Неоднократно ошибочным. В конце концов, я перешёл на реальные данные USDA по зонам и сопоставил правильную зону с рекомендациями, сгенерированными ИИ. Эта комбинация сработала идеально.
ИИ — мощный инструмент, но ему всё ещё нужны качественные данные.
Всегда готовьте резервный вариант представления для старых устройств
Apple Intelligence работает не на всех устройствах. Если вы полагаетесь на модели или функции, связанные с ИИ, убедитесь, что приложение по-прежнему выглядит полноценным на устройствах, которые не поддерживают эти функции. Простой и удобный резервный вариант представления играет важную роль.
Никаких жёстких пейволов
Мой подход был прост. Пользователи могут использовать всё, но в бесплатной версии им доступны только пять овощей. Нет никаких внезапных ограничений, экрана блокировки, грубых подсказок. Пользователи могут изучать приложение в своём собственном темпе.
Это повысило доверие пользователей к приложению, а доверие ценнее конверсий.
StoreKit 2 на удивление удобен
StoreKit 2 вместе с файлом конфигурации встроенных покупок значительно упростили тестирование и интеграцию. Тестирование в песочнице прошло отлично и позволило мне выявить проблемы до релиза.
Apple Store Server Notifications — ваши друзья
Apple предоставляет API для уведомлений, который отправляет события при каждом изменении чего-либо в подписке пользователя. Его очень легко настроить. С помощью ngrok вы даже можете протестировать весь процесс локально. Как только событие происходит, вы можете переслать его в Slack или любой другой инструмент, используемый вашей командой.
Инструменты для программирования на основе ИИ просто невероятны
ChatGPT помог мне дорабатывать представления, улучшать логику, искать альтернативы и отлаживать идеи. Создание отдельного проекта в ChatGPT позволило собрать все мои промпты в одном месте. Я чувствовал себя так, будто у меня есть помощник по дизайну и архитектуре, который никогда не устаёт.
Простые флаги функций победили
Вместо того, чтобы создавать сложную систему, я сделал очень просто. Я жёстко запрограммировал, какие овощи бесплатны. Вот и всё. Это упрощает поддержку кода и делает логику очевидной.
Бета-тестеры бесценны
Мои тестировщики обнаружили проблемы, предложили улучшения и подтвердили решения. Их отзывы существенно изменили продукт. Никогда не пропускайте тестирование с реальными людьми.
Не обязательно уметь делать скриншоты
Я использовал AppScreens для всех своих скриншотов. Это сэкономило кучу времени и придало приложению изысканный вид.
Иконка приложения, созданная с помощью креативности и ChatGPT
Я проработал несколько концепций иконки с помощью ChatGPT. Он даже сгенерировал для меня файлы ресурсов. То, что заняло бы часы, превратилось в увлекательный процесс.
Не забывайте ссылки на легальные документы
Убедитесь, что ваши Условия обслуживания и Политика конфиденциальности отображаются как на экране покупки в приложении, так и на странице приложения в App Store. Забыв об этом, вы получите мгновенный отказ.
Маркетинг сложнее разработки
Возможно, это самый важный урок. Написание кода — сложная задача, но она кажется естественной. Маркетинг же, напротив, — это как говорить на другом языке. Вы можете создать красивое приложение, тщательно его протестировать и довести до совершенства каждый его элемент, но если вы не сможете донести его ценность, оно будет тихо лежать в App Store, так и не достигнув тех, кому оно может понравиться.
Я провел бесчисленное количество часов, экспериментируя со скриншотами, переписывая описания и пытаясь найти правильный баланс между ясностью и увлекательностью. Социальные сети меняются очень быстро. Рейтинги поиска в App Store непредсказуемы. Люди пролистывают и забывают. Это может показаться криком против ветра.
Маркетинг заставляет вас думать о вашем приложении с человеческой точки зрения. Какую проблему оно решает? Почему это должно кого-то волновать? Как можно объяснить свою идею одним предложением, оставаясь при этом самим собой?
Это медленная работа. Она требует терпения. Она требует скромности. И это гораздо сложнее, чем сама разработка. Но когда кто-то находит ваше приложение, использует его и говорит, что оно улучшило его жизнь, все эти усилия кажутся стоящими.
Заключение
Создание My Veggie Garden научило меня гораздо большему, чем просто структурированию представлений SwiftUI или тонкой настройке модели данных. Она показала мне, как важно прислушиваться к пользователям, упрощать, когда становится сложно, и быть терпеливым, когда работа не выглядит привлекательно. Это напомнило мне, что отличные приложения не только пишутся с чистым кодом, но и формируются реальными людьми, честной обратной связью и множеством небольших решений, которые со временем складываются в единое целое.
Прежде всего, этот проект показал мне, что путь не заканчивается с выпуском. Настоящая работа начинается, когда ваше приложение находится в руках других, и вы продолжаете учиться, совершенствоваться и адаптироваться. Будь то доработка функций, устранение небольших проблем или попытки привлечь новых пользователей с помощью маркетинга, каждый шаг учит вас чему-то ценному.
Я благодарен за этот опыт, благодарен тем, кто тестировал и поддерживал приложение, и рад продолжать его улучшать. Если вы разрабатываете своё собственное приложение, надеюсь, что некоторые из этих уроков помогут вам в вашем пути.
-
Аналитика магазинов2 недели назад
Мобильный рынок Ближнего Востока: исследование Bidease и Sensor Tower выявляет драйверы роста
-
Интегрированные среды разработки3 недели назад
Chad: The Brainrot IDE — дикая среда разработки с играми и развлечениями
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.45
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.46


