Создание своего первого iOS-приложения – это всегда увлекательный и вместе с тем сложный процесс, который требует не только знания технологий, но и правильного подхода к планированию и архитектуре проекта. В этой статье я расскажу о своем опыте разработки приложения Hoot, поделюсь техническими решениями и особенностями, которые помогут понять, как подступиться к разработке мобильных приложений новичку и не только. Идея и цель проекта Приложение Hoot было создано для моей партнерши Аланы. Его главная задача – стимулировать живое общение между друзьями, которые жили в разных городах и из-за удаленности потеряли возможность часто общаться. В основе приложения лежит простая идея: каждый день пользователи получают от приложения единый вопрос, на который они отвечают.
После того, как все предоставят свои ответы, можно просмотреть, что написали остальные. Это позволяет поддерживать интересные беседы и укреплять отношения вне зависимости от расстояния. Выбор технологий В процессе разработки первой версии приложения я столкнулся с выбором клиентских технологий. Несмотря на то, что у меня есть опыт в веб-разработке, мне хотелось попробовать что-то нативное для iOS. Однако решил остановиться на React Native, так как знаком с этим фреймворком и понимал, что для моего проекта он идеально подходит.
Одним из камней преткновения был язык программирования – изучать Swift с нуля казалось слишком долгим процессом, по сравнению с использованием React Native. Кроме того, поскольку в дальнейшем была идея расширять приложение и на платформу Android, React Native обеспечивал кроссплатформенность и значительную экономию времени. Для упрощения построения приложения использовался Expo – набор инструментов, который предоставляет доступ к полезным библиотекам, быстрому роутингу и автоматизации сборок. Expo помогает сосредоточиться на разработке, минимизируя рутинные задачи, связанные с публикацией и доставкой приложений. Серверная часть и архитектура Для серверной части приложения я выбрал Ruby on Rails, потому что хорошо знаком с этим фреймворком, а также ценю его простоту и зрелость.
Rails показался идеальным решением, поскольку позволяет быстро создавать API и управлять серверными процессами с минимальными издержками. Несмотря на то, что некоторые разработчики предпочитают Node.js или другие более современные платформы, Rails по-прежнему остается мощным и удобным инструментом, особенно для одного человека, который одновременно решает множество задач. Одним из важных аспектов стал выбор модели взаимодействия пользователей. Первоначально планировалась модель подписок по типу «фолловер/фоллоуинг», похожая на Instagram, но со временем было решено перейти к концепции групп.
Группы представляют собой приватные чаты, куда можно пригласить участников определенного круга. В отличие от системы подписок, где контент может быть асимметричным, здесь все участники видят все сообщения, что создает более интимную и ориентированную на конкретные аудитории среду. Аутентификация и безопасность Создавая мобильное приложение с серверной частью на Rails, встретился с необходимостью придумать удобный и безопасный способ аутентификации. Поскольку Rails традиционно ориентирован на cookie-based аутентификацию в веб-приложениях, я решил создать собственную систему токен-авторизации, чтобы сделать регистрацию и вход простыми и безопасными для мобильного клиента. Модель аутентификации работает по следующему принципу: клиент отправляет на сервер учетные данные (например, email и пароль или же токен Apple ID), сервер проверяет их и возвращает токен с ограниченным временем жизни.
Клиент сохраняет токены в защищенном хранилище устройства, и использует их для последующих запросов к серверу. Особенность системы в том, что токены имеют срок действия – обычно час, а также есть долгоживущий refresh token на 90 дней, который позволяет обновлять основной токен без необходимости постоянной авторизации. Реализация своего аутентификационного механизма позволила минимизировать сторонние зависимости и получить гибкость для будущего расширения – к примеру, я добавил поддержку входа через email, помимо Apple ID, до релиза приложения. Клиентская архитектура Одна из важнейших целей – упростить логику на клиенте, убрав избыточное состояние и минимизировав возможность рассинхронизации данных. Для этого я выбрал Tanstack Query – библиотеку, которая занимается получением данных напрямую с сервера, кэшированием, обновлением и реактивностью.
Такой подход значительно сокращает количество кода, связанного с управлением состоянием, и позволяет быстрее реагировать на изменения данных без лишних багов. Вместо хранения и копирования данных клиент всегда запрашивает свежую информацию, а локальное состояние ограничивается лишь временными циклами внутри компонента. Глобальные состояния (например, сессия пользователя и текущая группа) хранятся в React Context, что облегчает передачу данных по всему приложению без сложных посредников. Планирование опросов и работы с расписанием Нельзя забывать, что основная функция Hoot – это отправка ежедневного вопроса группе в соответствии с заданным расписанием. Для этого я реализовал в базе данных хранение расписания в виде строки, где цифры обозначают дни недели.
Такая реализация позволяет SQL-запросом легко определить, в какой из дней необходимо активировать новый вопрос. Каждое утро сервер выбирает наиболее популярный среди доступных вопрос и активирует его. После чего отправляет уведомление всем участникам группы через Apple Push Notification Service. Это стимулирует пользователей заходить в приложение и отвечать на вопросы, поддерживая живое общение. Развертывание и поддержка Hoot размещается на виртуальной машине в облаке, где находятся и база данных, и очередь задач.
Это простая архитектура, обеспечивающая стабильность и возможность масштабирования в будущем. Образовательные материалы для выкладывания приложения в App Store упрощаются с помощью Expo Application Services. Для хранения медиафайлов используется Amazon S3, а для отправки электронных писем – сервис Sendgrid. Основные трудности и выводы Создание приложения одному человеку всегда сопровождается множеством сложностей. Главное – уметь управлять сложностью проекта, стараться выбирать инструменты и архитектурные решения, которые не создают дополнительных проблем.
Именно поэтому я не стал использовать громоздкие системы аутентификации или состояния, предпочтя простоту и прозрачность. Важно, что подход к разработке был практичным – учитывалось время, которое я мог уделять проекту после основной работы, а также стоимость поддержки приложения. Так, например, отказ от излишне сложных архитектур позволил быстро создать работающий продукт и встретиться с пользователями уже на ранних этапах. Для тех, кто хочет начать создавать собственные приложения, советую тщательно обдумывать выбор технологий, начинать с простых решений и поэтапно улучшать проект, опираясь на отзывы пользователей и собственный опыт. Используйте возможности современных инструментов, ищите самые эффективные методы управления состоянием и заложите в основу приложения удобную архитектуру.
Тогда первый опыт мобильной разработки станет не только учебным, но и шагом к серьезным проектам. Hoot теперь доступен для загрузки в App Store, и он успешно помогает людям сохранять связь в цифровом мире. Для меня работа над этим приложением стала не просто техническим вызовом, но и творческим путешествием, полным новых знаний и открытий, которыми я рад поделиться с сообществом.