Приложение Маяки Эстонии

Коничива, уважаемый!

За время вашего отсутствия мы тут вон чего понаписали:

22

Продолжаю рассказ о разработке приложения "Маяки России". Вчерашняя публикация носила несколько деструктивный характер: то не прижилось, это реализовать не получилось. Сегодня всё наоборот и первое, с чего надо начать - функционал приложения (каким я его изначально задумывал) готов полностью. А вот с дизайном и UI ещё точно надо поработать.

Большая часть приложения, работу над которой я завершил сегодня - "Мои маяки". Это избранное, где пользователь может сохранять для себя маяки из приложения. На странице каждого маяка есть кнопка, которая позволяет добавить этот маяк в избранное или убрать оттуда. Также это можно сделать долгим нажатием прямо на странице списка маяков. На самой странице "Мои маяки" находится, собственно, список отмеченных маяков. Также там можно по-тиндеровски смахнуть маяк вправо и он будет удалён из списка. Теперь у меня есть железобетонное оправдание перед женой, зачем я ставил Tinder.

На разработку всего этого функционала у меня ушло 8-9 часов, результатом я крайне доволен. Для скачивания данная версия пока не доступна, как писал выше, надо поработать с интерфейсом.

21

О приложении "Маяки России" не писал больше полутора месяцев, самое время. Много добавил контента, но об этом напишу отдельно в отчётной публикации, сейчас же именно разработка. Ей в чистом виде я уделял времени куда меньше, чем контенту. На этой неделе переключился на неё и... многое пришлось переделывать.

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

Приложение "Маяки России"

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

Короче, что ни строчка кода - то шаг с совершенству.

12

Не писал новостей на эту тему с начала октября, и могло сложиться ощущение, что приложением я совсем не занимаюсь. Для "Маяков России" я закончил добавлять информацию о маяках, количество которых увеличилось с 45 до 49. Фотографии добавлены для 30 маяков и больше у меня нет. Хочется надеяться, что добуду ещё. Начал добавлять тексты не своего написания о маяках и знаках Ладоги. На этом этапе пришлось сделать паузу и переключиться на "Маяки Прибалтики".

Ещё в самом начале, когда приложение называлось "Маяки Эстонии", мне очень хотелось наглядно показать сектора работы маяков, как это сделано у нас на сайте Navigatsioonimärkide nimekiri. Чтож, я перевыполнил задание! У меня это ещё и с анимацией.

Необязательные технические подробности: изображения секторов не являются заранее заготовленными картинками, а рисуются непосредственно в приложении по указанным характеристикам огня. Пришлось добавлять много новых данных и в какой-то момент я столкнулся с проблемой. Маяки Эстонии добавились без проблем, сектора соответствовали действительности, проверить не сложно. А вот первый же латвийский маяк явно светил вглубь берега. Оказалось, в официальных источниках всех трёх стран система координат (точнее положение 0 градусов) отличается. Более того, в двух латвийских официальных источниках сектора некоторых маяков не совпадают. Пришлось всё подгонять под "эстонский" формат, когда 0 градусов совпадает с 6 часами на циферблате часов и именно в этой системе они и отображаются в приложении, в разделе "Сектора и режимы огня". Всё это заняло 3-4 десятка часов работы. Также добавил новый маяк - Клайпедский передний. Ну и ещё одна старая задумка - изображения карт с указание маршрута до самых труднодоступных маяков. Для примера: комфортную дорогу до самого подножья заднего маяка Паралепа я нашёл лишь на свой четвёртый визит к нему.

Приложение "Маяки Эстонии" Приложение "Маяки Эстонии"

После некоторого количества обязательных технических проблем, стабильная версия приложения была выпущена. В Play Market она была доступна ещё вчера, в AppGallery она на рассмотрении, AppStore тоже в процессе. Отличное большое обновление, которым я горжусь и после которого технически уже и добавить-то нечего.

1

Ещё немного дневников разработчика приложения "Маяки России". Самое главное, о чём я сейчас расскажу, это статус проекта в целом. Но сначала немного о кэшировании. В "Маяках Прибалтики" все данные хранятся локально и кэшировать попросту нечего. В новом приложении все данные из интернета и надо а) дать возможность пользователю использовать приложение без интернета и б) несколько сократить передачу данных. Насколько я понял ситуацию, есть два способа: обычное кэширование и скачивание файлов с данными, то есть, что-то вроде offline-версии приложения. Первый способ комбинирует хранение данных и при этом их обновление, но имеет один недостаток - кэшем в первую очередь управляет ОС и нежданно-негаданно для пользователя она может этот кэш удалить. По умолчанию кэш хранится 30 дней, но из своей практики пользователя смартфона скажу, что вообще ни разу не имел проблем с нежелательно удалённым кэшем. Возможно, имеется в виду 30 дней, когда приложение ни разу не запускалось.

Теперь второй способ. У него есть один плюс: ОС не удалит файлы в тайне от пользователя. Больше плюсов нет. Никакой системы обновления данных тут не предусмотрено, так что, в любом случае, надо как-то комбинировать это с кэшем, а ещё придётся запрашивать у пользователя разрешение на использование памяти смартфона.

Очевидно, что первый способ - мой выбор. Так что я вторгся на совершенно новую для себя территорию и начал затачивать лапки под кэширование. Оказалось, во Flutter всё уже есть "из коробки", просто работать с этим удобнее через плагины. Для кэширования данных я использую flutter_cache_manager, а для фотографий - cached_network_image. Просто и очень удобно! Фактически всё делается само и я не должен думать где хранить, как хранить, как называть, как и когда обновлять. Важный нюанс - сама логика кэша. Это локальное сохранение получаемых данных. На практике это выливается в то, что без интернета будут доступны лишь те данные и фото, которые пользователь уже просматривал. То есть, если установить приложение, и запустить его в первый раз без интернета, никаких данных не будет. Также не будет данных, если без интернета попробовать открыть какой-то маяк или регион, который ранее не просматривался. Но в любом случае, я очень доволен тем, как это работает.

Совершенно отдельный вопрос - кэширование карты. Поизучав этот вопрос, я узнал, что в Mapbox можно скачивать и использовать локально хранящиеся тайлы карты. Если сделать соответствующую функцию, то пользователи приложения меня разорят, так как в месяц бесплатно можно качать определённое количество тайлов, а за остальные мне надо платить. Другой вопрос, что и не нужна такая функция, потому что Mapbox и так кэширует векторные карты. Это легко проверить в "Маяках Прибалтики", если удалить весь кэш приложения, открыть его и перейти там на карту, ничего не приближая (её первоначальный вид). После этого поставить режим "в самолёте" и открыть приложение заново. Теперь можно приближать, удалять и двигать, и будет хорошо видно, что закэшировано и с какой детализацией. Также, если какой-то из участков карты приближался и скачивались его более детализованные данные, они тоже кэшируются. Короче, очень неглупые люди API для Mapbox делали.

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

На этом хорошие новости заканчиваются, потому что помимо программирования есть ещё и контент. Немного цифр. Тексты о маяках Эстонии я писал полтора года для сайта и потом пару месяцев переносил их и фотографии в приложение, это порядка 60 маяков. Тексты о маяках Латвии и Литвы писались полгода сразу на сайт и для приложения. В "Маяках России" самих маяков будет в 3-4 раза больше, чем в прибалтийском приложении. Я поставил себе цель писать по три текста в день. Мой 3d-принтер покрылся толстым слоем пыли, к эпоксидке я не прикасался больше месяца, а последняя поделка (второй экземпляр Таллиннского верхнего маяка в масштабе 1:500) так и стоит не доделанная. При этом, только в очень редкие дни я выполняю свой план и постоянно живу с ощущением, что я что-то кому-то должен. Это давит. Очевидно, план надо снижать, я уже готовлю себя к мысли, что в этом году релиза не будет. Более того, с фотографиями всё совсем вышло из-под контроля. То, что начиналось очень хорошо, скатилось в канаву: из всех людей, кто согласился помочь своими фотографиями, снимки прислали 12 человек, а это менее половины. Те, которые прислали, вы самые лучшие, спасибо вам огромнейшее! Остальным я пытался напоминать, кто-то отказывался от участия в проекте, кто-то игнорит, кто-то переходит на агрессию, мол, вообще не до меня. В итоге, сейчас я вообще не занимаюсь поиском фотографий.

Ладно, ныть мы все умеем, а что по существу? По существу, полностью готов регион Калининградской области (11 маяков), но нет фотографий к одному из маяков (Гвардейский). В Инстаграме я их нашёл, но получить не удалось. Следующий регион, Сахалин и Курилы - всего 45 маяков, из которых сейчас написаны тексты для 35, фотографии вообще не подготовлены. На следующей неделе необходимо его закончить. Дальше надо будет делать самые популярные регионы: Финский залив, Ладога, Онега, Белое и Баренцево моря. После этого, в теории, можно выпускать приложение и после этого добавлять остальные данные. Ещё есть идея - после релиза запустить открытый канал в Телеграме для обсуждения приложения. Такой вот роадмап.

18

Продолжу немного рассказывать о приложении. Меня очень выбили из колеи проблемы с предыдущим. Сделал совсем небольшое косметическое обновление версии для Android и... приложение стало вылетать при попытке открыть карту. А карту я не менял совсем. С одной стороны ситуация анекдотичная, мол "я не трогал, оно само", а с другой - первые три дня я почти не вылезал из-за компьютера, пытаясь найти проблему. Приложение и карта в нём отлично работали на эмуляторе, компилировались без ошибок, но на смартфоне карта продолжала вылетать. Я перепробовал всё, на что хватило моего ума: отключал поочерёдно функции карты в готовом приложении, делал совершенно новое приложение с картой, компилировал примеры, идущие вместе с плагином карт. После трёх десятков часов таких ковыряний уровень понимания проблемы был нулевым. Я не продвинулся ни на миллиметр. Важный нюанс: я поменял компьютер, на который заново были установлены все программы для разработки и именно после этого ошибка и появилась. В какой-то момент появилась иллюзия победы: приложение, загруженное на телефон непосредственно из Android Studio, работало без ошибок. Я сделал новый релиз, загрузил в маркет, обновил приложение у себя на телефоне и... ошибка никуда не ушла. Очень сильно ситуацию усугублял тот факт, что в Play Market'е была опубликована версия с этой ошибкой и, как я узнал, нельзя было отменить и убрать последний релиз и вернуть предыдущий неглючный. Раньше можно было, а теперь Гугл убрал эту возможность. В итоге, переработка, гонка и стресс, а на выходе ноль. Идей больше не было, тикет на GitHub и вопрос на Stackoverflow не помогли совсем. Остался последний вариант - забить. Я дал проблеме отдохнуть от себя, съездил на Рухну и спустя дней пять начал ковыряться снова и уже к обеду работающая без ошибок версия была отправлена в Play Market на код-ревью. Перебрав ранее все остальные варианты, я начал разбираться с тем, что могло измениться при переносе приложения с одного компьютера на другой, а именно настройками проекта. Ранее я знал, что Flutter - это фреймворк, который использует язык программирования Dart. Чего я не знал, так это того, что в конечном итоге приложение компилируется под другой язык. Для андроида это Kotlin или Java, причём выбрать это в Android Studio можно лишь один раз при создании нового приложения. Я не уверен на 100%, но мне кажется, что почти два года назад, когда я только начинал делать "Маяки Прибалтики", возможности такого выбора не было. Насколько я понимаю ситуацию, при переносе проекта с одного компьютера на другой, результирующий язык с Java поменялся на Kotlin и это начало вызывать ошибку. Другой вопрос, почему под Kotlin карта не работает, хотя должна. А в моём случае изменение языка на Java убрало ошибку.

Теперь немного о новом приложении. Абзацем выше я уже писал, что начинал писать "Маяки Прибалтики" почти два года назад, в ноябре 2019. Сейчас я сел за новое приложение и реально офигел, как сильно изменился Flutter за это время. Изначально я планировал брать готовые куски кода из старого приложения и с минимальными изменениями использовать в новом, но за меня решили, что так не будет. В Dart появилась такая штука как Null safety. В теории вещь прекрасная, на практике хоть и не сильная, но постоянная "попаболь". Так что приложение "Маяки России" я пишу полностью с нуля.

Ещё одним аспектом, который изменился очень сильно, стали стили и темы. Поясню: во Flutter стили элементов можно писать непосредственно в самом элементе (как inline CSS в HTML), либо объявить и описать всё заранее (как CSS "нормального человека"). Сложность в том, что первый способ значительно проще и очевиднее, но отдельное оформление для светлой и тёмной тем работает только во втором способе, который на тот момент был плохо задокументирован. Короче, в "Маяках Прибалтики" мне пришлось делать очень костыльную смесь обоих способов. Сейчас этот вопрос проработан намного лучше и написать тему намного проще и удобнее.

Цитировать
в комментарии