Расскажу о своем первом мобильном приложении. Эта история об упорстве, ужасных костылях и успехе.
Устраивайтесь поудобнее и запасайтесь фейспалмами
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPYh0LXsAAVlS-.jpg?table=block&id=e80f6dc0-e23b-4dce-9dd7-d114016eee22&cache=v2)
История началась в далеком 2015 году, когда я обучался на втором курсе в УрФУ и меня окончательно достало каждый раз логиниться на сайте университета, чтобы посмотреть расписание или баллы за сданную работу, к тому же у сайта не было мобильной верстки!
Это все натолкнуло меня на мысль создать свое мобильное приложение, где можно было бы узнать все то же, что и на сайте, только намного быстрее и с дополнительными фичами, вроде уведомления о следующей паре.
И так как смартфон у меня был Android, и на тот момент я уже немного знал Java, то выбор платформы был очевиден. Проблема была в том, что я совершенно не знал Android и пришлось изучать его уже в бою.
Как говорится вижу цель, не вижу препятствий. Осталось придумать как же получать данные для приложения. И путем не долгих исследований я осознаю, что у университетского сервиса нет публичного апи…
Я понимаю, что никто в здравом уме скорее всего не стал делать то же, что и я. Поэтому приведу другие варианты, чтобы бы выбрали вы в такой ситуации?
🤔
57.0%
Сделал бы свой бекенд🤔
29.0%
Попросил бы публичное апи🤔
14.0%
Нет API — нет приложенияНо я пошел своим путем и решил парсить сайт прямо с мобилки🤦♂️ Казалось бы бери обычный http клиент, делай запрос и парси сайт, но тут я встретился с главной проблемой — аутентификацией.
Я перепробовал все адекватные варианты, отчаялся и перешел к неадекватным, а именно к использованию web view, и я сейчас не говорю про отображение верстки сайта в приложении...
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPbdyZXwAEwgOa.jpg?table=block&id=61a653aa-9cec-46f5-9561-c5ec0a327cd4&cache=v2)
Так как же залогиниться на сайте, используя webview, но при этом с нативной версткой приложения? Все очень просто: ищем поля логина и пароля в DOM-дереве, вбиваем данные и нажимаем на кнопку “войти” 🤗
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPcRydX0AMrAMq.jpg?table=block&id=77516d04-7a0e-415e-aec4-9f5c7780f2be&cache=v2)
Ну ладно, допустим мы зашли, а дальше что? А дальше нам необходимо как-то передать данные из webview в приложение и в этом нам поможет JavaScriptInterface.
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPcjHwXoAU7eUF.jpg?table=block&id=343c3191-aa46-48cc-a5e6-fdd3c97a58f0&cache=v2)
Как ни странно, все работало как часы: я дожидался загрузки страницы, парсил данные из html и отображал их нативно. Проблема началась тогда, когда страница не перезагружалась при клике на новую неделю расписания.
Мне удалось сделать JS инъекцию и отслеживать изменения DOM поддерева, но по какой-то причине этот колбэк вызывался несколько раз и получить измененную страницу мы могли только после трех вызовов этой функции.
Ну и я недолго думая просто зафигачил счетчик вызовов функции, который обнулялся после трех вызовов. Удивляюсь как после этого я вообще не бросил программирование…
Проблем с получением данных я больше не испытывал, зато испытывал проблемы с Android, и моими лучшими друзьями стали StackOverflow и другие русскоязычные сайты по Android разработке. С такими друзьями качество кода было скажем не лучшим…
Я решил что-то с этим сделать, прочитал две крутые книжки: Effective Java и Чистый код, преисполнился и понял, что мой код максимально ужасен, но все попытки что-либо улучшить были тщетны.
Но благодаря моим врожденным навыкам к тестированию, приложение работало без нареканий, оно могло работать даже в отсутствии интернета, правильно сохраняло стейт при изменении конфигурации и так далее.
Таким образом, спустя несколько месяцев разработки, я выпустил первую версию приложения и выглядела она следующим образом. Для того времени дизайн приложения выглядел вполне сносно.
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPd55OXMAAEsbi.png?table=block&id=6c9eaaa2-9bd5-436b-9b96-87c82663f6bd&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPd7B-X0AQiqgm.png?table=block&id=52a1337f-2455-4cd5-a816-12dd8aec3297&cache=v2)
Я сделал плакаты с рекламой приложения, расклеил их в общаге и универе, рассказал о приложении всем знакомым, тем самым запустил сарафанное радио и приложение стало достаточно популярным.
Приложение было бесплатным, и мне захотелось хотя бы отбить стоимость аккаунта разработчика. Таким образом я сделал премиум доступ и даже запилил свою виртуальную валюту💵
Премиум доступ включал в себя оффлайн расписание с возможностью редактирования. И это было хорошей идеей, несмотря на то, что стоимость была всего 50 рублей, я в несколько раз окупил стоимость аккаунта разработчика.
А вот виртуальная валюта не принесла мне ничего… Чтобы ее заработать нужно было либо смотреть рекламу, либо скачивать приложения по реферальной ссылке. Это приносило очень мало денег, а вывести их можно было только после $250, которые я так и не заработал😿
Самое смешное, что для того, чтобы никто не взломал мой премиум доступ я реализовал какое-то шифрование на коленке для проверки покупки, но при этом флаг премиум доступа хранился в открытом виде в Shared Preferences...
![notion image](https://www.notion.so/image/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFEPfNSbWQAMSAfr.jpg?table=block&id=6fe1ad1f-316d-4474-864e-02c29bd40f50&cache=v2)
Ну ладно, будем подводить итоги. Как думаете сколько раз за 4 года существования приложения я был вынужден переделать парсер верстки сайта? Правильно, ни разу!
С — значит стабильность.
Приложение имело более 10 тысяч установок и 800 отзывов, при этом средний рейтинг был в районе 4.8. Это очередной раз говорит, что пользователей не волнует, что у вас под капотом, главное, чтобы приложение было удобным и хорошо работало.
Также это приложение помогло мне защитить диплом, устроиться на первую работу в качестве Android разработчика. Поэтому не бойтесь экспериментировать, делать что-то новое, будьте настойчивым и у вас обязательно все получится!
![Алексей Панов](https://www.notion.so/image/https%3A%2F%2Fi.imgur.com%2FISpCLAy.jpeg?table=block&id=aee5f9ae-1739-4d99-b408-3047a4a9ab0f&cache=v2)