Представьте: пользователь создаёт повторяющуюся встречу в Москве, а через 2 часа видит её в Берлине в неправильном дне и на час раньше. Это — реальная ошибка, которую мы исправляли у клиента из сферы HR. Корректная обработка часовых поясов, синхронизация с системным календарём и повторяющиеся события — три кита надёжного планировщика. За 5 лет мы набили шишки на 30+ проектах. Реализация календаря и планировщика в мобильном приложении — наша специализация.
Выбор библиотеки для календаря и планировщика
В 80% проектов хватает готовой библиотеки. Для iOS UIKit используйте FSCalendar с кастомизацией через appearance API. В SwiftUI проще написать свою обёртку на LazyVGrid или взять swift-calendar. На Android kizitonwose/calendar поддерживает Jetpack Compose. Для Flutter table_calendar с 2000+ stars покрывает базовые сценарии.
Собственная реализация оправдана только при нестандартном дизайне или тысячах событий — она в 2–3 раза дороже по времени, но даёт полный контроль.
Как обрабатывать часовые пояса без багов?
Храните даты в UTC (ISO 8601, например 2023-03-15T14:30:00Z). Конвертируйте в локальное время только при отображении. На iOS используйте Calendar(identifier: .gregorian) c timeZone = TimeZone.current. Для фиксированных событий задавайте timeZone явно.
На Android применяйте java.time.ZonedDateTime (API 26+) или ThreeTenBP. Избегайте java.util.Date — он стал источником 80% часовых багов в наших аудитах.
Почему повторяющиеся события — это сложно?
Стандарт iCalendar (RFC 5545) требует RRULE. Пример: FREQ=WEEKLY;BYDAY=MO,WE,FR. Мы храним правило и список исключений (EXDATE) в базе, а экземпляры вычисляем на лету для отображаемого диапазона. Это экономит до 30% времени обработки по сравнению с генерацией всех экземпляров.
Apple's EventKit полностью поддерживает RRULE через EKRecurrenceRule. Для кастомного хранилища подойдут ical4j (JVM) или RRuleSwift.
Синхронизация с системным календарём
На iOS — запрос разрешения EKEntityType.event, работа через EKEventStore. На Android — CalendarProvider c ContentResolver. Синхронизация двусторонняя: слушайте EKEventStoreChangedNotification на iOS и ContentObserver на Android.
Совет по производительности
Для отрисовки маркеров событий используйте CALayer или кастомный drawRect: — это в 10 раз быстрее, чем добавление UIView на каждую ячейку.
Процесс разработки
- Анализ требований — определение типов событий, сценариев повторения и синхронизации.
- Проектирование архитектуры данных: модель события, хранение RRULE, кэширование.
- Интеграция выбранной библиотеки или написание кастомного UI.
- Реализация всех видов отображения: день, неделя, месяц с поддержкой жестов.
- Настройка повторяющихся событий и синхронизации с системным планировщиком.
- Тестирование на реальных устройствах с покрытием unit-тестами.
- Документация и передача кода.
Что входит в разработку планировщика
Реализация мобильного приложения с календарём и планировщиком включает:
- Настройку видов: день, неделя, месяц — для iOS и Android.
- Хранение событий в локальной базе (SQLite/Room/CoreData).
- Синхронизацию с системным календарём устройства.
- Обработку часовых поясов и повторяющихся событий по RFC 5545.
- Поддержку уведомлений и виджетов.
Разработку мобильного планировщика выполняем под ключ — от прототипа до публикации в сторах. Стоимость базового календаря — от $720–1k. Полноценный планировщик с синхронизацией — от $1.8k–2.6k.
Оценка производительности при десятках тысяч событий
Для больших наборов данных используйте виртуализацию. Загружайте только видимый месяц плюс 30 дней вперёд и назад. На iOS применяйте NSFetchedResultsController, на Android — Room с Flow. Это снижает нагрузку на рендеринг на 40%.
| Тип календаря | Срок разработки | Стоимость |
|---|---|---|
| Базовый месячный | 1–2 недели | от $720–1k |
| Полноценный планировщик | 3–6 недель | от $1.8k–2.6k |
| Кастом с нуля | 6–12 недель | индивидуально |
| Платформа | Рекомендуемая библиотека | Поддержка Compose/SwiftUI |
|---|---|---|
| iOS (UIKit) | FSCalendar | — |
| iOS (SwiftUI) | swift-calendar / LazyVGrid | да |
| Android | kizitonwose/calendar | да |
| Flutter | table_calendar | да |
Стоимость и сроки разработки
Используя готовые библиотеки, мы сокращаем срок разработки планировщика на 2–3 недели — это лучше, чем писать с нуля. При разработке с нуля средний срок — 8–12 недель против 3–6 недель с библиотекой. Оценим ваш проект за 1 день и пришлём предложение. Более 5 лет мы реализуем мобильные приложения с календарями: от простых событийников до корпоративных планировщиков с синхронизацией, уведомлениями и виджетами. Наши клиенты сокращают время разработки на 40% благодаря нашему опыту и готовым шаблонам. Закажите разработку мобильного приложения с календарём и планировщиком — свяжитесь с нами.







