Волгатех.Коллектив: обновление из приложения, версия для iPhone и компьютеров, напоминания и виджет
Версии 0.5.1 и 0.5.2: приложение само предлагает обновление и проверяет файл перед установкой, работает в браузере — на iPhone без App Store и на компьютере в своей раскладке, напоминает о занятиях, показывает ближайшую пару на виджете, сообщает о новых письмах и хранит отчёты об ошибках только на устройстве.
После встроенной почты за неделю вышли две версии. Они отвечают на три вопроса, которые оставались открытыми: как обновлять приложение, которого нет в магазине, как пользоваться им на iPhone, для которого нет подписанной сборки, и как сделать так, чтобы расписание напоминало о себе само. На скриншотах — вымышленные данные.
Обновление без магазина приложений
Приложение распространяется файлами APK со страницы выпусков, и до версии 0.5.1 о новой версии можно было узнать, только зайдя туда. Теперь приложение само спрашивает GitHub о последнем выпуске — при запуске и при возвращении, не чаще раза в шесть часов. Если версия новее, поверх открытого экрана появляется полоса «Доступна версия X · N МБ».
«Обновить» скачивает APK именно для этой сборки — со встроенной почтой или без, для нужного типа процессора, который приложение узнаёт из кода своей версии. Перед установкой файл сверяется с размером и SHA-256, которые публикует GitHub, и только потом передаётся установщику Android. Тот в свою очередь примет APK, только если он подписан ключом самого приложения, поэтому подменить обновление чужим файлом нельзя.



iPhone без App Store
Для iPhone у приложения есть сборка, но подписать и выложить её можно только с платной учётной записью разработчика Apple. Обходной путь оказался в самом Flutter: то же приложение собрано для браузера, открывается в Safari и ставится на экран «Домой» как отдельное приложение со своими данными. Сайт публикуется на GitHub Pages и на GitVerse и обновляется при каждом изменении приложения, так что обновлять ничего не нужно.
Чтобы браузерная версия вела себя как настоящая, пришлось закрыть несколько мест:
- Безопасные области экрана. Вырез, Dynamic Island и полоска «Домой» Safari сообщает через CSS
env(), а веб-движок Flutter оставляет их нулевыми. Приложение читает их само, в том числе в горизонтальной ориентации. - Ничего с чужих серверов. Шрифт Roboto и движок Flutter лежат на самом сайте, поэтому ни один запрос не уходит в Google.
- Запуск без сети. Service worker сохраняет только файлы самого приложения и никогда — ответы API университета. Первая версия заработала без сети лишь со второго визита: при первом страница загружалась раньше, чем worker успевал её увидеть. Теперь запущенное приложение само передаёт worker’у список загруженных файлов, и одного визита достаточно.
- Заставка загрузки. Пока грузится движок, видны логотип и полоса прогресса по шагам запуска. Через 8 секунд заставка говорит, что связь медленная, через 30 — предлагает обновить страницу.
Каждый экран проверен тестами на размерах всех iPhone, от первого SE до 17 Pro Max, и в горизонтальной ориентации, с настоящим шрифтом: ничего не выходит за край и не прячется под строкой состояния. Так нашлась кнопка .docx, которая на экране шириной 320 точек разрывала слово.
У браузерной версии есть честные ограничения. Почта открывается веб-версией в новой вкладке: почтовый сервер не разрешает веб-странице обращаться к нему, поэтому встроенного клиента в браузере нет. Нет блокировки по Face ID, напоминаний, виджета и уведомлений о почте: веб-страница не может проснуться в заданное время.
Компьютер
Тот же сайт открывается и на компьютере. В окне шириной от 1000 пикселей меню остаётся открытым слева, а экраны переключаются рядом с ним, сохраняя своё состояние. Списки держат читаемую ширину, обзор недели раскладывает дни сеткой, а стрелки ← и → листают день, неделю и месяц. В Chrome и Edge сайт можно установить как отдельное приложение.

Расписание напоминает о себе
- «Сегодня» возвращает к текущему дню из любого другого дня или недели.
- «В календарь» выгружает занятия недели или экзамены файлом
.icsдля Google Календаря, Outlook или календаря iPhone. Файл соответствует RFC 5545: время переведено в UTC из московского, строки перенесены по 75 байт так, чтобы не разрезать букву, совместное занятие двух групп — одно событие. Идентификаторы событий не меняются от выгрузки к выгрузке, поэтому повторный импорт обновляет календарь, а не удваивает его. - Напоминания за 10, 15 или 30 минут до занятия — с предметом и аудиторией. Они строятся по загруженным неделям, не дальше чем на две вперёд, на точных будильниках Android и переживают перезагрузку телефона. На эмуляторе они пришли с точностью до секунды.
- Виджет «Ближайшая пара» показывает текущее или следующее занятие и то, что после него, и сам переходит к следующему, когда занятие кончается, — по будильнику, который не будит телефон.
Выход из учётной записи теперь очищает и виджет, и запланированные напоминания.
Почта
В сборке со встроенной почтой появились уведомления о новых письмах. Android проверяет «Входящие» раз в 15 минут — чаще система не позволяет — даже при закрытом приложении, одним лёгким запросом о двадцати последних письмах. Уведомление получает только непрочитанное письмо, пришедшее после последнего уже показанного, и только один раз: включение функции не поднимает старую почту. Если сервер отклонил пароль, приложение его забывает, чтобы фоновые проверки не приблизили блокировку учётной записи.
Ещё несколько писем теперь можно выбрать сразу и пометить, переместить, отправить в архив или удалить — с одной кнопкой «Отменить» на всех. Закрепление использует собственные закрепления Outlook, поэтому видно и в веб-версии. Картинки, PDF и текстовые вложения открываются прямо в приложении.



Отчёты об ошибках
Ошибки приложения теперь записываются — но только на самом устройстве, последние двадцать. В «Настройках» их видно с версией, числом повторов и местом в коде, и отправить разработчику их можно только вручную: через меню «Поделиться» на Android или копированием в браузере. Перед этим из отчёта убираются адреса, токены и длинные числа, так что в нём нет ни логина, ни почты, ни данных расписания.
Выводы
- Обновление вне магазина приложений безопасно, если проверяется дважды: файл сверяется с опубликованными размером и хешем, а установщик принимает только подпись самого приложения.
- Кроссплатформенный фреймворк даёт обходной путь к платформе, закрытой для распространения: браузерная сборка на iPhone не требует учётной записи разработчика.
- Браузерная версия честна, когда её ограничения названы прямо: без уведомлений и встроенной почты — потому что веб-страница этого не может.
- Офлайн-кэш стоит проверять на самом первом визите: именно там worker ещё ничего не видел.
- Фоновая работа должна быть осторожнее основной: проверка почты, которая забывает отклонённый пароль, не доведёт учётную запись до блокировки.
Доступность
- Браузерная версия: konkin-nikita.ru/volgatech.corp
- APK для Android: github.com/nikita-konkin/volgatech.corp/releases
- Исходный код: github.com/nikita-konkin/volgatech.corp
Теги
Другие обновления по проекту
Волгатех.Коллектив: Liquid Glass — стекло, иней и узоры времён года
Как в приложении появилась тема «Liquid Glass»: полупрозрачные панели над цветным фоном, матовое стекло, иней из фрактальных кристаллов и узор по времени года — листья, иней, цв...
Волгатех.Коллектив: своя почта для университетского Exchange
В версии 0.5.0 «Почта» стала встроенным клиентом вместо веб-версии в окне приложения. Университетская почта — локальный Exchange без OAuth, поэтому клиенту нужен пароль, а прило...