RedCalendar — облачный трекер цикла, или покоряем Африку

Когда-то давно заметил, что у моей жены установлено странное приложение для отслеживания цикла. Тогда я подумал о двух вещах:

  • Почему оно такое некрасивое
  • Почему я не знаю о том, что там происходит

Подумал и забыл.

С детства я любил конструкторы и думал, что буду архитектором когда вырасту. Потом в моей жизни появилось программирование: сначала абстрактное (школьное), а затем стал писать приложения для Windows на Delphi. В те времена я делал автозапуски к дискам, а к окончанию школы написал висящее в трее приложение для извлечения лотка CD-ROM и свой редактор реестра. Всё это очень нравилось, поэтому решил продолжить обучение в институте, поступив на «информационные системы». На втором курсе устроился работать в салон связи к своим друзьям, где, поработав менеджером по продажам, переквалифицировался в мастера по ремонту телефонов. Институт закончил, но никто не мог предложить по моей специальности молодому специалисту даже что-то близкое к тому, что получалось зарабатывать на тот момент, поэтому программирование осталось моим хобби.

И вот однажды наткнулся на курсы Алексея Скутаренко по iOS разработке, вдохновился, купил макбук и начал учиться. Добросовестно закончив их, решил «заняться делом» и поучаствовал в паре стартапов (провальных, как и положено), параллельно изучая Стэнфордские курсы по Swift с Полом Хэгарти. В те времена Google представила Firebase и я написал пару клиент-серверных приложений, работающих на этой платформе. А потом вспомнил про трекер цикла.

Решил сделать бесплатное и полезное приложение с современной архитектурой. Которое можно бесконечно развивать, добавляя новые возможности.

Реализация

Мне нравятся люди, которые пишут, что сделали что-то крутое за выходные или месяц. Я им не очень верю, потому что сам так не умею: от идеи до первого релиза мне потребовалось около двух лет: по несколько раз переписывал авторизацию, хранение и синхронизацию данных, если что-то работало не так, как хотелось. Иногда сильно увлекался и в итоге всё затягивал, понимая при этом, что эти улучшения никто не заметит, но для меня они были важны. Сейчас мне не стыдно за каждый хранящийся / принятый / отправленный байт, а приложение работает даже в авиарежиме и так, как задумывалось.

Графику рисовал кодом, а где нельзя — использовал векторные изображения. И вот, первый результат, который можно «потрогать», готов.

Наглядный прогноз, простое добавление данных и, конечно же, модная тёмная тема

Всё работает в облаке (для реализации п. 2 в будущем, хотя, пожалуй, сегодня так должны работать все приложения). Вот, для наглядности запустил календарь под одним аккаунтом на трёх разных телефонах и пользовался ими по очереди в реальном времени. Так выглядит запись с экранов:

Облачная синхронизация в деле

Сейчас модно рассказывать про использование машинного обучения и нейронных сетей. Но это иногда комично и не всегда уместно, например, в моём случае (не понимаю, кого тут обычно обманывают — пользователей или инвесторов). Пусть организм непредсказуем, можно собирать статистику и использовать эти данные. Для расчета используются медианные значения за последние 3–7 месяцев, при этом предусмотрено, что если девушке при нерегулярном цикле назначат таблетки для его нормализации и она укажет параметры нового идеального цикла, приложение запомнит их на 3 месяца.

Особое внимание уделил уведомлениям. Изначально решил не надоедать пользователям и присылать их только по делу: за 2 дня до начала цикла, через день после окончания менструации (если забыли отметить) и за 4 дня до предполагаемой овуляции. Сейчас уведомления приходят в 9:00 с учётом часового пояса, который (если нужно) корректируется при запуске приложения (чтобы не мешать, например, в отпуске). Ещё, если человек запускал календарь за 3 часа до уведомления, он его не получит (уже и так всё посмотрел).

Не все пользователи догадались как отмечать циклы, когда календарь пуст, поэтому пришлось быстро выпускать обновление с пояснениями. Зато оценили возможность добавлять комментарии с Emoji к любому дню и стали активно пользоваться этой возможностью.

Причём тут Африка?

Приложение вышло на русском и английском, загрузки начались по всему миру. App Store Connect показывает статистику с задержкой в пару дней, поэтому первую аудиторию изучал по номерам авторизовавшихся пользователей.

Страна по номеру телефона по информации spravportal.ru

С самого начала лидировала Африка. Возможно, для этих пользователей был решающим размер загружаемого приложения: порядка 10 МБ у меня, вместо 158 — у Flo, 91— у Clue или 58 — у Life. Сеичас пользователей из Африки порядка 70%.

Были и Тайланд, и Шри Ланка, и Украина, а позже — Великобритания, США, Германия и другие страны. А вот России почему-то не было вообще.

Первые проблемы или «почему пишу эту статью только сейчас»

Позже выяснилось, что загрузки из России тоже есть, но именно пользователи не появляются. Поскольку приложение облачное, для работы нужна учётная запись. Для входа используется номер телефона. Если человек уже пользовался приложением, мы покажем ему его данные. А если нет — спросим, что он знает о своем цикле и создадим учётную запись. Для авторизации используются штатные функции Firebase и, как показала практика, смс часто блокировались российскими операторами, особенно на Билайне. Надо было что-то срочно придумывать. Вход через Google, Apple ID или twitter не рассматривал, потому что в будущем будет версия для партнера/мамы, которых будет удобнее приглашать именно по номеру (как сделано в клабхаусе). Выбор пал на FlashCall (когда вам звонит робот и нужно ввести последние четыре цифры его номера). Это пришлось делать вручную, но сейчас такой способ нравится даже больше, чем вход по смс.

Реклама и деньги

Я задумывал приложение как бесплатное и не планировал (и пока не планирую) встраивать рекламу. Основной функционал останется бесплатным навсегда. Но, возможно, добавлю премиум опции по подписке или единоразовому платежу:

  • Гибкие теги для дней

  • Настройку времени отправки уведомлений
  • Возможность делиться информацией с партнёром / мамой

Ссылки

Загрузить приложение можно здесь (iOS) или с сайта calendar.red.

0
35 комментариев
Написать комментарий...
Виталий Подольский

Знаете почему люди пишут, что сделали свое приложение за месяц-два? Просто изначально идет продумывание функционала, планирование архитектуры, дизайн и уже после код. Так, что у тех, кто имеет достаточный опыт разработки, все эти шаги идут как само собой разумеющееся. Стоит начать писать код без плана, проект незаметно становится долгостроем. Но ничего, продолжайте писать код, опыт придет со временем и вы начнете подобные приложение пачками выпускать, во время выходных, буквально на коленке. Это я сужу по себе. Если приложение у меня спланировано, напишу быстро. Стоит начать экспромт, могу вообще забросить со временем.

По поводу дизайна могу посоветовать envato elements, там по копеечной подписке доступны полноценные дизайн-макеты на все случаи жизни (решает проблему с отсутствием дизайнера).

P.S.: Жена оценила новое приложение? =)

Ответить
Развернуть ветку
Виталий Подольский

Чуть не забыл, Firebase - зло, учитесь быстро писать свой бак, чтобы не было после мучительно больно. Если с этим проблема, то тогда лучше parse-server у себя развернуть. Зато будет полный контроль над сервером без сюрпризов в виде тайм-аута на запросах и прочего.

Ответить
Развернуть ветку
Artem Petrenkov
Знаете почему люди пишут, что сделали свое приложение за месяц-два? Просто изначально идет продумывание функционала, планирование архитектуры, дизайн и уже после код.

Ещё и потому, что автор сам себе и заказчик, и аналитик, и дизайнер, и архитектор, и разработчик, и тестировщик. Количество коммуникационных связей равно нулю, поэтому на взаимодействие не затрачивается времени, а самому с собой всегда проще договориться, чем ожидать, когда аналитик вытянет из заказчика хотелки, передаст их команде, пока дизайнер нарисует и согласует дизайн, пока под scope будет набросана архитектура и написано что-либо. Так что даже одну формочку можно писать полгода (реальный опыт из практики).

Ответить
Развернуть ветку
Артём Болотов
Автор

Вот мне нравится тоже что не надо никому ничего объяснять и согласовывать. Но иногда даже с собой сложно договориться))

Ответить
Развернуть ветку
Виталий Подольский

Согласен, но тут наверное речь о пет-проектах. На коммерческой разработке можно долго незначительную фигню делать =)

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Dmitry Tumashev

Тоже в компании попали на эту проблему. Не приходят как-то максимально случайно - то всё норм, то какой-нибудь один оператор отвалится, то сразу несколько.
В качестве "спасательного круга" сделали отправку через российский шлюз при нажатии пользователем "Выслать код снова". Пока устраивает)

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Артём Болотов
Автор

Может и удачная, но как быть, если всё-таки придёт первый код? Firebase присылает один и тот же код, в кастомном варианте (через российский шлюз) придётся генерировать код самому и он будет отличаться от первого. И проверять его нужно отдельной функцией в том же интерфейсе. Конечно, можно сделать коды разной длины и всё будет понятно. Но где гарантия, что код через российский шлюз придёт в Африку или Нидерланды? Звонок придёт гарантированно и будет стоить значительно дешевле смс с кодом

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Артём Болотов
Автор

Хорошо, я же не спорю. Тоже думал о такой реализации, но взвесив все аргументы, выбрал альтернативный вариант

Ответить
Развернуть ветку
Артём Болотов
Автор

Просто если пользователю придут сразу две смс, какой код ему вводить? Первый проверит Firebase. Второй надо проверять самим. Если нажали «выслать повторно», получается, проверять надо самому и, если придут обе смс, один из кодов станет неверным. Сегодня проблемы с смс замечены только в России. Но и в других странах они могут быть, поскольку для доставки кодов используют дешевые каналы

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Артём Болотов
Автор

И даём человеку возможность авторизоваться двумя кодами и увеличиваем его шансы на временную блокировку номера в одной из систем😉

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Артём Болотов
Автор

Завтра напишу в лс, если интересно и расскажу

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Артём Болотов
Автор

В основном проблемы с Билайном. Они периодические и бывают дни, когда теряется 100% смс. Мы общались с представителем Firebase: отсылал им номера, где точно смс терялись. Проблему признали и обещали решить. Не решили, смс иногда не приходят😔

Ответить
Развернуть ветку
Artem Petrenkov
Они периодические и бывают дни, когда теряется 100% смс.

Месячные :)

Ответить
Развернуть ветку
useless uS

Можете рассказать, в чем отличия вашего календаря от встроенного в Здоровье на iOS?

Ответить
Развернуть ветку
Артём Болотов
Автор

Он работает в облаке, поэтому можно будет делиться информацией с партнёром и реализовать еще несколько интересных функций. Когда будет версия для андроида, можно будет просто ввести свой номер телефона и продолжить пользоваться там. В программе «Здоровье» фаза лютеинизации зафиксирована и равна 13 дням (хотя исследования показывают, что должно быть 14 дней), и вообще она может отличаться (моё приложение умеет её рассчитывать если девушка отметила овуляцию хотя бы раз). Есть и много идей по развитию приложения: это же только первый релиз.

Ответить
Развернуть ветку
Алексей Киреев

Ахах, а если произойдет утечка данных, в моду войдут еще и звонки в те самые дни чтобы просто потролить

Ответить
Развернуть ветку
useless uS

Почему сразу просто потроллить!

Представляете, это же продаваны могут получить базу данных по ПМС - дням, в которые лучше не попадаться под горячую руку со своими холодными звонками.

Ответить
Развернуть ветку
Артём Болотов
Автор

Вот тоже так хочу, потому что много идей как по этому проекту, так и другие хочу сделать)
Знаю, что нужен чёткий план и он даже есть!

Ответить
Развернуть ветку
Виталий Подольский

Ну если в Москве живете, может кофе попить и я могу поделиться наработками

Ответить
Развернуть ветку
Артём Болотов
Автор

Живу в Костроме)

Ответить
Развернуть ветку
Виталий Подольский

Ну ничего, все равно опыт придет по планированию. Просто изначально пробуйте максимально детализировать идею, после на бумаге схемы порисуйте что где и как взаимодействует. После с модельками посидите подумайте, тоже можно на схеме все изобразить (я часто делаю это через диаграммы).

Ответить
Развернуть ветку
Артём Болотов
Автор

Тоже люблю с бумажками сидеть) Спасибо, Виталий

Ответить
Развернуть ветку
Виталий Подольский

Да не за что! Удачи в реализации идей

Ответить
Развернуть ветку
Aleksey Karavashkin

Очень достойно!!! 👏🏾👏🏾👏🏾

Ответить
Развернуть ветку
Артём Болотов
Автор

Благодарю🤝

Ответить
Развернуть ветку
Leon Brodsky

Какими сервисами для верификации номера через отсылку смс имеет смысл пользоваться - чтобы было глобальное покрытие, близко к 100% доставляемость и адекватные цены? (кроме Firebase) 

Ответить
Развернуть ветку
Артём Болотов
Автор
Ответить
Развернуть ветку
Leon Brodsky

Вы лично с ними работали? Действительно высокий процент проходимости близкий к 100? 

Ответить
Развернуть ветку
Артём Болотов
Автор

Сейчас у меня звонки идут через них. Заверяют, что отправляют смс через официальные каналы и они точно будут доставлены. Фирма представлена в разных странах (у нас тоже есть представительство, т.е. договор заключал прямо с русским ООО), очень хороший API . Возможно, по ценам можно найти чуть дешевле (тарифы они присылают выслушав задачу и поняв, что будет происходить). 

Ответить
Развернуть ветку
32 комментария
Раскрывать всегда