🔥

Тред (Алексей Панов)


Расскажу о своем первом мобильном приложении. Эта история об упорстве, ужасных костылях и успехе. Устраивайтесь поудобнее и запасайтесь фейспалмами
notion image

История началась в далеком 2015 году, когда я обучался на втором курсе в УрФУ и меня окончательно достало каждый раз логиниться на сайте университета, чтобы посмотреть расписание или баллы за сданную работу, к тому же у сайта не было мобильной верстки!

Это все натолкнуло меня на мысль создать свое мобильное приложение, где можно было бы узнать все то же, что и на сайте, только намного быстрее и с дополнительными фичами, вроде уведомления о следующей паре.

И так как смартфон у меня был Android, и на тот момент я уже немного знал Java, то выбор платформы был очевиден. Проблема была в том, что я совершенно не знал Android и пришлось изучать его уже в бою.

Как говорится вижу цель, не вижу препятствий. Осталось придумать как же получать данные для приложения. И путем не долгих исследований я осознаю, что у университетского сервиса нет публичного апи…

Я понимаю, что никто в здравом уме скорее всего не стал делать то же, что и я. Поэтому приведу другие варианты, чтобы бы выбрали вы в такой ситуации?
🤔 57.0% Сделал бы свой бекенд
🤔 29.0% Попросил бы публичное апи
🤔 14.0% Нет API — нет приложения

Но я пошел своим путем и решил парсить сайт прямо с мобилки🤦‍♂️ Казалось бы бери обычный http клиент, делай запрос и парси сайт, но тут я встретился с главной проблемой — аутентификацией.

Я перепробовал все адекватные варианты, отчаялся и перешел к неадекватным, а именно к использованию web view, и я сейчас не говорю про отображение верстки сайта в приложении...
notion image

Так как же залогиниться на сайте, используя webview, но при этом с нативной версткой приложения? Все очень просто: ищем поля логина и пароля в DOM-дереве, вбиваем данные и нажимаем на кнопку “войти” 🤗
notion image

Ну ладно, допустим мы зашли, а дальше что? А дальше нам необходимо как-то передать данные из webview в приложение и в этом нам поможет JavaScriptInterface.
notion image

Как ни странно, все работало как часы: я дожидался загрузки страницы, парсил данные из html и отображал их нативно. Проблема началась тогда, когда страница не перезагружалась при клике на новую неделю расписания.

Мне удалось сделать JS инъекцию и отслеживать изменения DOM поддерева, но по какой-то причине этот колбэк вызывался несколько раз и получить измененную страницу мы могли только после трех вызовов этой функции.

Ну и я недолго думая просто зафигачил счетчик вызовов функции, который обнулялся после трех вызовов. Удивляюсь как после этого я вообще не бросил программирование…

Проблем с получением данных я больше не испытывал, зато испытывал проблемы с Android, и моими лучшими друзьями стали StackOverflow и другие русскоязычные сайты по Android разработке. С такими друзьями качество кода было скажем не лучшим…

Я решил что-то с этим сделать, прочитал две крутые книжки: Effective Java и Чистый код, преисполнился и понял, что мой код максимально ужасен, но все попытки что-либо улучшить были тщетны.

Но благодаря моим врожденным навыкам к тестированию, приложение работало без нареканий, оно могло работать даже в отсутствии интернета, правильно сохраняло стейт при изменении конфигурации и так далее.

Таким образом, спустя несколько месяцев разработки, я выпустил первую версию приложения и выглядела она следующим образом. Для того времени дизайн приложения выглядел вполне сносно.
notion image
notion image

Я сделал плакаты с рекламой приложения, расклеил их в общаге и универе, рассказал о приложении всем знакомым, тем самым запустил сарафанное радио и приложение стало достаточно популярным.

Приложение было бесплатным, и мне захотелось хотя бы отбить стоимость аккаунта разработчика. Таким образом я сделал премиум доступ и даже запилил свою виртуальную валюту💵

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

А вот виртуальная валюта не принесла мне ничего… Чтобы ее заработать нужно было либо смотреть рекламу, либо скачивать приложения по реферальной ссылке. Это приносило очень мало денег, а вывести их можно было только после $250, которые я так и не заработал😿

Самое смешное, что для того, чтобы никто не взломал мой премиум доступ я реализовал какое-то шифрование на коленке для проверки покупки, но при этом флаг премиум доступа хранился в открытом виде в Shared Preferences...
notion image

Ну ладно, будем подводить итоги. Как думаете сколько раз за 4 года существования приложения я был вынужден переделать парсер верстки сайта? Правильно, ни разу! С — значит стабильность.

Приложение имело более 10 тысяч установок и 800 отзывов, при этом средний рейтинг был в районе 4.8. Это очередной раз говорит, что пользователей не волнует, что у вас под капотом, главное, чтобы приложение было удобным и хорошо работало.

Также это приложение помогло мне защитить диплом, устроиться на первую работу в качестве Android разработчика. Поэтому не бойтесь экспериментировать, делать что-то новое, будьте настойчивым и у вас обязательно все получится!

Алексей ПановАлексей Панов