Реализация календаря и планировщика в мобильном приложении

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

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация календаря и планировщика в мобильном приложении
Средний
~1-2 недели
Часто задаваемые вопросы

Календарь мобильного приложения: где ломается логика времени

Календарь мобильного приложения ломается не на отрисовке сетки, а на логике событий: хранение времени, повторяемость и синхронизация — три независимых слоя, и ошибка в любом видна пользователю как «приложение врёт».

Классика — хранение локального времени вместо абсолютного момента. Устройство уходит в другой часовой пояс или переходит на летнее время, и встреча, сохранённая как «10:00 по месту», превращается в «11:00» или уезжает на сутки. Те же ошибки при выборе даты дают сдвиг на границе месяца и года, когда расчёт идёт по локальной дате без нормализации. Лечится разведением двух сущностей: момент начала — всегда в едином базисе, а отображение и правила напоминаний считаются уже под часовой пояс устройства на момент показа.

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

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

Цена этих дефектов видна в поддержке: жалобы вида «у меня другое расписание» не воспроизводятся без привязки к часовому поясу и состоянию очереди. Разбираем, как закрывается каждый из слоёв.

Что даёт надёжный планировщик продукту и поддержке

Единая логика событий на всех платформах

Надёжный планировщик строится вокруг одного источника правды: правила повторяемости, границы суток и переходы часовых поясов считает серверная модель, а приложение только показывает результат. До этого каждый клиент считал календарь сам, и единый список событий расходился — на телефоне встреча стояла на день раньше, чем на планшете, а напоминание приходило в чужом поясе. Доля расхождений на приёмочном наборе из переходов на летнее время, смены пояса и длинных серий сократилась до нуля, потому что их теперь проверяет один сценарий проверки, а не пользователь.

Меньше обращений в поддержку по датам

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

Уходит целый класс отказов вида «событие есть на телефоне и нет на планшете» — он закрыт архитектурно, а не инструкцией для оператора. Нагрузка на первую линию падает в разы: вопросы по датам и напоминаниям чаще всего были следствием рассинхронизации, а не ошибки человека. Разбор одного случая занимает один запрос к истории изменений вместо переписки с пользователем.

Режимы работы планировщика: сравнение подходов

Режим планировщика определяет, где хранится источник правды о событиях: на устройстве, во внешней системе или на нашем сервере. От этого зависят работа без сети, разрешение конфликтов и объём работ при добавлении общих напоминаний.

Вариант Когда подходит Ограничения
События только на устройстве Личный планировщик без общей базы, важна работа без сети Нет общего доступа, перенос на новое устройство вручную, напоминания живут, пока приложение установлено
Синхронизация с внешней системой Календарь уже ведётся в корпоративной системе, дублировать данные нельзя Готовый модуль навязывает чужую модель повторов и прав, часовые пояса и роли приходится подгонять
Собственная серверная модель Общие события, роли, уведомления, история изменений Дольше в разработке: миграции, слияние версий, фоновая отправка
Гибрид Личные и рабочие события вместе, нужен офлайн Две модели рядом: правила слияния и приоритеты описываем заранее

Как выбрать режим под сценарий пользователя

Ответьте на три вопроса: нужен ли общий доступ, должен ли планировщик работать без сети, кто владеет повторами. Если событие создаётся в корпоративной системе, а приложение только показывает его — достаточно синхронизации. Если пользователь сам создаёт события и делится ими — нужна серверная модель.

Границы применимости каждого варианта

Локальный режим упирается в переустановку приложения и смену устройства. Синхронизация — в задержку внешней системы и её схему прав. Серверная модель требует фоновой отправки и понятного разрешения конфликтов. Гибрид оправдан, когда личный и рабочий контуры нельзя смешивать в одном хранилище.

Порядок внедрения: от аудита до передачи в поддержку

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

Что делаем на аудите и при проектировании схемы

  1. Аудит логики дат. Собираем все места работы со временем: ответы сервера, локальные напоминания, повторяющиеся события, метки в кэше. Отмечаем, где хранится момент времени, а где — локальные дата и время без смещения, и где эти подходы смешаны.
  2. Проектирование модели событий. Описываем сущности: событие, серия повторов, исключение из серии, участник, право доступа. Правило — в хранилище момент времени, в местное переводим только при выводе на экран.
  3. Синхронизация и права. Определяем источник правды, разрешение конфликтов при правке с двух устройств, поведение при потере связи и попадание чужих событий в выборку.
  4. Проверка граничных сценариев. Прогоняем переход на летнее время, событие в несуществующем часе, повтор «последнее число месяца», смену часового пояса в пути и отмену серии с уже изменёнными экземплярами.
  5. Нагрузочная проверка. Смотрим, как ведут себя выборки и напоминания на плотном расписании и большом числе участников, где появляются задержки.
  6. Передача в поддержку. Отдаём схему данных, описание модели повторов, перечень проверенных граничных случаев и инструкцию по разбору жалоб на пропавшие или задвоенные напоминания.

Настройки, схемы и регламенты, которые передаём

Передаём не только работающее приложение, но и комплект документов, по которому ваша команда сможет развивать планировщик и разбирать обращения без нас. Ниже — что именно остаётся у вас на руках.

Документация по логике событий и правам

  • Конфигурация планировщика: параметры повторов, правила обработки пересекающихся событий, поведение при смене часового пояса и переходе на летнее время.
  • Схема модели событий: сущности «событие», «участник», «напоминание», «исключение из серии», обязательные и вычисляемые поля, связи между ними.
  • Схема прав доступа: роли владельца календаря, участника и наблюдателя, что каждая может читать и менять, как права наследуются на общие и внешние календари.
  • Описание синхронизации: какие источники двусторонние, какие только на чтение, как разрешаются конфликты одновременных правок и что видит пользователь при потере связи.

Регламент обновления и поддержки

  • Регламент обновления событий: порядок выпуска изменений в правилах повторов и напоминаний так, чтобы уже созданные записи не терялись и не дублировались.
  • Инструкции для поддержки: дерево решений по типовым обращениям — событие не появилось, напоминание сработало дважды, права не применились.
  • Порядок отката и точки контроля: какая версия схемы совместима с предыдущей сборкой, что делать при расхождении данных на устройствах.

Документы оформлены в репозитории рядом с кодом и проверяются на актуальность при каждом релизе. Передачу закрываем разбором с вашей командой — чтобы документацией пользовались, а не хранили её.

Кейс: синхронизация календаря с внешними системами

Клиент — сервис записи на услуги: мобильное приложение и панель администратора, календарь которых жил отдельно от Google Calendar, куда менеджеры вносили встречи вручную. Доля расхождений доходила до 6% объёма событий: перенесённая встреча оставалась в старом слоте, поддержка получала около 40 обращений «запись есть, а мастера нет», а разбор одного инцидента занимал в среднем 25 минут — логи приложения и внешней системы не сходились по идентификаторам.

В рамках кейса внедрения планировщика мы перевели обмен на постоянный двусторонний цикл с журналом изменений. Каждое событие получило стабильный идентификатор и метку ревизии, а мобильный клиент — локальный кэш, из которого интерфейс рисуется мгновенно, в том числе без сети. Изменения уходят очередью и повторяются после восстановления связи, поэтому потерянный пакет больше не превращается в потерянную встречу.

Обработка конфликтов и повторяющихся событий

Конфликты правок событий решаем не по принципу «кто последний, тот и прав». Правка из внешней системы сравнивается по метке ревизии: выигрывает более новая версия, а проигравшая не исчезает — она уходит в историю и показывается администратору как предложение. Повторяющиеся события хранятся серией со списком исключений и замен, а не развёрнутыми копиями: перенос одной встречи не ломает серию, а смена часового пояса не сдвигает весь график.

Через два месяца расхождения сократились с 6% до 0,3%, обращения по календарю — с 40 до 5 в месяц, разбор инцидента — с 25 до 7 минут за счёт сквозного идентификатора события. «Главный результат не в цифрах, — говорит наш инженер, — а в том, что ручной сверки двух календарей больше нет: если что-то расходится, система сама показывает, где и когда».

Готовый модуль планирования или собственная модель событий?

Готовый модуль закрывает базовый случай: событие — точка во времени с названием, участниками и напоминанием. Он даёт показ месяца и недели, простые правила повтора, уведомления и чтение системного календаря устройства. Как только появляется предметная логика — смены, окна записи, зависимости между задачами — начинается обход его ограничений.

Границы применимости определяет один признак: кто владеет моделью события. Если расписание описывается парой «начало — конец» и одним типом записи, модуль окупается быстро — меньше кода, предсказуемое поведение при смене часового пояса и переходе на летнее время. Если тип события задаёт доступные действия и допустимую длительность, модель нужна своя, а модуль остаётся слоем отрисовки.

Основное ограничение — типы событий не расширяются. Лишние атрибуты складывают в одно поле заметок, и фильтрация по ним превращается в ручную выборку по тексту. Свой слой событий задаёт тип, набор полей и правила их сочетания: календарь остаётся интерфейсом, а источником истины становится ваша модель, а не компонент.

Если часть расписания уже развёрнута на другой логике, полумеры обходятся дороже. Разумнее зафиксировать текущие типы и правила, оставить их работать, а новый интерфейс поставить поверх через слой преобразования: прежние записи читаются, новые пишутся сразу в целевую модель. Переход идёт постепенно, без остановки для пользователей.

Выбор делают по числу сущностей, а не по вкусу. Если хватает штатных полей и одного правила повтора — берём готовый модуль. Если типов больше двух или правила конфликтуют между собой — своя модель событий дешевле в поддержке. Дальше разбираем, как это ложится на конкретное расписание.

Частые технические вопросы по реализации

Вопросы на приёмке обычно касаются не отрисовки сетки месяца, а поведения на стыках: переход через полночь, смена пояса в дороге, длинные серии повторений, одновременная правка с двух устройств. Ниже — короткие ответы инженеров о том, как эти сомнения закрываются в коде и в процессе.

Как события переживают смену часового пояса?

Момент времени хранится в UTC, а смещение применяется только при отображении — при перелёте сетка пересобирается в поясе устройства, а не уезжает на несколько часов. База часовых поясов обновляется отдельно от кода приложения, поэтому изменение правил перехода на летнее время не требует выпуска новой версии.

Как устроены повторяющиеся события?

Серия хранится правилом, а не набором дат: «каждый второй вторник», «последний рабочий день месяца». Исключения и переносы одного вхождения лежат отдельными записями — правка одного дня не переписывает всю серию, а у длинных правил задан предел раскрытия.

Что происходит при одновременной правке с двух устройств?

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

Можно ли менять логику планировщика без выпуска версии в магазины?

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

Как проверяете календарь перед выпуском?

Отдельным прогоном по краевым сценариям: событие в 23:59 с переходом через сутки, серия без даты окончания, 29 февраля, часовой пояс, меняющийся у активного повторения, перевод устройства вперёд и назад.

Чек-лист приёмки календаря: «Граничные сценарии ломают планировщик чаще, чем основной поток, — поэтому каждый выпуск прогоняется по ним отдельно, до проверки обычных сценариев».

Обсудим задачу и вернёмся с оценкой и планом

Прежде чем называть сроки, фиксируем границы задачи: от этого зависит и оценка, и то, какие сценарии календаря мобильного приложения попадают в первую версию, а какие — во вторую. Ниже — что уточняем у вас при разборе и что прикладываем к плану работ по внедрению.

  • Сценарии использования: личное расписание, командный календарь, бронирование ресурсов — какие обязательны к запуску, а какие можно отложить.
  • Роли и права: кто создаёт события, кто видит чужое расписание, нужно ли подтверждение участия и уведомления об изменениях.
  • Внешние системы: с какими сервисами нужна синхронизация, в какую сторону идёт обмен, как разрешаем конфликт записей и разрыв связи.
  • Объём расписания: сколько событий приходится на пользователя, нужны ли повторяющиеся записи, несколько часовых поясов, связанные ресурсы.
  • Работа без сети и напоминания: как приложение ведёт себя офлайн, что синхронизирует при возврате связи, какие уведомления критичны для пользователя.
  • Сроки и ограничения: дата, к которой нужен запуск, привязка к выпускам, ожидаемая нагрузка в пиковые периоды.
  • Ограничения на вашей стороне: доступы и стенды, требования к хранению данных, готовность серверной части к обмену.

В ответ вы получаете план работ по внедрению: состав этапов, оценку сроков по каждому, зоны ответственности нашей команды и вашей стороны, порядок приёмки с критериями готовности. Опишите задачу — вернёмся с оценкой и планом.

  • Относиться к календарю как к статичной сетке дней: не описывают правила повторяемости, переносов и исключений. Первое же «каждую вторую среду, кроме праздников» ломает логику, и переделка стоит дороже, чем проектирование сразу.
  • Не продумывать поведение при смене часового пояса и переводе времени. Сотрудник уехал в командировку — событие сдвинулось, а разбираться в этом приходится поддержке, а не продукту.
  • Смешивать напоминание и событие в одну сущность. Тогда нельзя отдельно отменить уведомление, сохранив встречу, или перенести событие, не раздувая список напоминаний.
  • Ждать двусторонней синхронизации с внешними системами «как само собой». Без заранее описанных правил разрешения конфликтов появляются дубли, задвоенные участники и потерянные встречи.
  • Игнорировать офлайн-режим и обрыв связи. Правки, сделанные без сети, либо пропадают, либо затирают чужую версию события при восстановлении соединения.
  • Не задавать роли и права доступа: кто видит чужой календарь, кто его меняет, кто удаляет. Общий календарь подразделения быстро превращается в свалку, которой никто не доверяет.
  • Забывать про изменения состава участников — увольнение, отпуск, перевод в другой отдел. События остаются «висеть» на ушедшем сотруднике, а планировщик показывает недостоверную загрузку.
  • Планировать только личный календарь, не закладывая рабочий контур: согласование занятости, бронирование переговорных, пересечения с задачами. В итоге получается органайзер, который не решает рабочую задачу.
  • Не описывать, что видит пользователь при конфликте двух событий и как он их разрешает. Без понятного сценария люди просто перестают вносить важные встречи в приложение.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714