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

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

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

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 "нормального человека"). Сложность в том, что первый способ значительно проще и очевиднее, но отдельное оформление для светлой и тёмной тем работает только во втором способе, который на тот момент был плохо задокументирован. Короче, в "Маяках Прибалтики" мне пришлось делать очень костыльную смесь обоих способов. Сейчас этот вопрос проработан намного лучше и написать тему намного проще и удобнее.

3

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

приложения "Маяки Прибалтики"

Когда я начинал ездить по маякам Эстонии, я был уверен, что доберусь лишь до некоторой части, но не до всех. Объездил все, многие по несколько раз. Когда меня спрашивали на радио, не планирую ли я расширить своё приложение с маяков Эстонии до Латвии или Литвы, я уверенно отвечал, что нет. Уже 10 месяцев, как там вся Прибалтика. И уж точно я никогда бы не подумал, что возьмусь за новое приложение о маяках такой большой страны, как Россия. Отправной точкой тут несомненно стала поездка на Жужмуй. Я пообщался с представителями российского комьюнити любителей маяков. Это интереснейшие люди, преданные маякам также фанатично, как и я, а кто-то и больше. И именно с целью продолжить это общение и завести новые связи я решился делать новое приложение. А ещё мне самому это очень интересно.

Я очень горжусь своим прибалтийским приложением, так как знаю, что за ним стоит. Такой информации в онлайне не найти нигде, кроме приложения и данного сайта, да и фото тоже. И это качество контента очень мне дорого. Для приложения "Маяки России" от этой идеологии пришлось отказаться - объём маяков слишком велик (по моим очень приблизительным прикидкам 300-400), а я сам видел из них лишь 7-8, а фоткал и вовсе три. Поэтому главная идея нового приложения - сначала количество контента, а потом его качество. Не надо трактовать это в плохом контексте. В приложение будут добавляться не все, а лишь интересные для туристов маяки. Кроме "мёртвого", что крайне печально, форума mayaki.ru, я больше не знаю мест, где была бы собрана информация о большом количестве маяков России. Именно поэтому я говорю о превалировании количества над качеством и это только плюс. Да, на поиск и проверку исторической информации для каждого маяка я не могу потратить столько сил и времени, как это было с маяками Прибалтики, но... это можно будет сделать позже. Главной фишкой приложения "Маяки России" будет то, что все данные будут храниться на сервере и для их изменения не надо будет обновлять приложение. С фотографиями та же ситуация - все они будут не моими. Я с несколькими людьми, которые мне помогают посильно, ищу фотографии в Инсте и ВК, я списываюсь с авторами, большинство из них без проблем предоставляют свои фотографии. Но и в этом случае, найти фотки абсолютно всех маяков - невозможно. Но я рассчитываю, что эта часть контента будет добавлена уже после релиза. Для этого внизу каждой страницы с инфо о маяке добавлена кнопка связи. Вот такой проект. В следующих публикациях я расскажу о том, на какой стадии он находится сейчас, а также непосредственно о программировании.

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