Обновить

Расписание ИТМО жило в приложении, а мне нужен был календарь. Поэтому я сделал сервис

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели6.1K
Всего голосов 4: ↑4 и ↓0+5
Комментарии4

Комментарии 4

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

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

На стороне сервиса: по умолчанию расписание обновляется раз в 3 часа, но в кабинете частоту можно поставить на 30 минут (это минимум). То есть данные у нас не старше получаса.

На стороне клиента: частоту опроса задаёт календарь. Мы отдаём подсказку REFRESH-INTERVAL на час, но клиент вправе её игнорировать. В Apple Календаре (macOS и iOS) можно открыть свойства подписки и выбрать автообновление вплоть до «каждые 5 минут» или вручную. Тогда перенос прилетает за считаные минуты.

Единственное место, где повлиять нельзя, это Google Календарь: внешние ICS-подписки он опрашивает по своему расписанию (обычно раз в несколько часов, иногда реже) и пользовательской настройки частоты там нет. Это ограничение платформы, а не сервиса.

Итого: если нужна максимальная оперативность, берите Apple Календарь (или CalDAV-клиент вроде DAVx⁵) и ставьте обновление раз в 5-15 минут, сервер при этом настроен на 30 минут. Худший случай тогда около получаса, обычно быстрее.

Интересно, как вы формируете UID события при переносе пары. Есть ли у занятия стабильный идентификатор в источнике, который сохраняется при смене времени и аудитории? Если нет, как отличаете перенос от удаления старой пары и появления новой? От этого зависит, увидит календарь обновление существующего события или отмену и новое событие.

Честный ответ: стабильного идентификатора занятия в источнике нет - API отдаёт только поля (предмет, время, аудитория, преподаватель, группа).

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

Склеивать перенос с прежней парой по эвристике не стали: надёжного признака «это та же пара, а не новая» в данных нет, а ошибка склейки хуже - она молча двигала бы чужое событие. Оговорка: смена предмета тоже даёт новый UID, хотя для человека это та же пара.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации