
И если Вам станет интересно, как то, что было до — стало тем, что справа, заходите под кат.
Часть 1. Цель оправдывает средства?
Основная мысль заключалась в том, что несмотря на огромное количество аналогов (тысячи их), хотелось создать велосипед приложение настолько простое и понятное, насколько это вообще возможно. Альфа-версию в блокноте с превью я создал после того, как окончательно устал переходить и кликать в небезызвестном «хранителе монет» ради того, чтобы добавить 100 рублей на свой счет.
Поэтому было решено, что следующие выходные пройдут не за сериальчиками, а за Xcode и за применением свифта в бою. Пусть я и айос-разработчик, однако в некоторых компаниях даже в продакшне все ещё используется objective-c.
До выходных я подключил девушку-дизайнера и немного проработал концепцию:
- Добавление цели должно быть не сложнее, чем в два перехода, включая вбивание суммы
- Нужна история транзакций
- Важная часть — возможность отменить действие сразу же
- Тёмная тема
Часть 2. Попробуем
Для реализации первой части хватило и UINavigationController. Был реализован сервис для генерации рутового контроллера в зависимости от следующих состояний:
- Пользователь первый раз запустил приложение
- Есть хотя бы одна активная цель
- Есть завершённые цели, но нет активных
Этим сценарием я попытался ускорить процесс создания цели и управления. Здесь и далее под целью подразумевается возможность накопить средства или управлять своим бюджетом.
Основной экран — это UIPageViewController вверху и клавиатура, которую можно было бы заюзать как кастомный inputView, но ночь была темна и полна ужасов, и в итоге там разместился набор кнопок. Как могут знать iOS-разработчики, у нас не так много возможностей менять фон кнопки в состоянии хайлайта, поэтому я использовал категорию для генерации картинки по заданным настройкам темы и менял их для разных стейтов.
Должен быть очень большой лейбл — наверное, первое, что приходит разработчику, когда он хочет увидеть вводимые цифры. Шучу, второе. Ведь при использовании textField пришлось бы проверять вводимый текст, вставлять проверки на допустимое количество символов, а это какое-никакое, но время.
Пусть будут благословлены создатели NumberFormatter, которые позволили отобразить разряды в суммах так, как хочется разработчику. К слову, далеко не все приложения используют правильный вид отображения цифр.
Я очень долго колебался между использованием CoreData, Realm и FMDB или своей прослойкой для sqlite, но в итоге чашу весов склонил в пользу FMDB. Просто потому, что захотелось.
Отмена транзакции — больная тема, т.к. хотелось это сделать как можно более интуитивно. Для этого я использовал кастомное UIView, и метод для соответствия с последней транзакцией. Сложности технической в этом нет, а вот то, что не переходя с экрана и с помощью <1 секунды можно отменить свое действие — стоит дорогого. Для баннеров и управления очередью (а вернее, показа последнего актуального) я использовал NotificationBannerSwift. А ссылки на все используемые опенсорсные компоненты будут внизу.
Даже не знаю зачем в предверии iOS 13 я решил реализовать тёмную тему, но что сделано, то сделано. Для этого можно было использовать разные подходы, но я реализовал смену тем с помощью кастомного класса и сервиса для управления между необходимыми отображениями. А сохранение настроек лежит в UserDefaults.
Для встроенной покупки (ну если кому-то вдруг приложение понравится), был использован стандартный фреймворк StoreKit и немного логики с обработкой стейтов транзакций.
Часть 3. Что получилось в итоге?
Какие фреймворки и компоненты были использованы:
- Работа с базой данных
- Какой же хамелеон крутой!
- Корпорация добра для пуш-уведомлений
- Fabric, Crashlytics. В принципе, сами их знаете
Есть ли планы?
Да, конечно есть. Планирую добавить экран для ввода пин-кода, возможность более интуитивно управлять бюджетом и поискать возможности для интеграции с ресурсами уровня повыше приложения за выходные, но понимаю, что шансов немного:)
ссылка на оригинал статьи https://habr.com/ru/post/461233/
Добавить комментарий