Классический мобильный банкинг для физлиц - это нативные приложения под iOS и Android. В силу санкционного давления и стремления к оптимизации процесса разработки наш клиент переходил на PWA (Progressive Web Application). Логичный шаг - так делают многие компании, попавшие под ограничения магазинов приложений.
Мы уже подходили к идее создать PWA около двух лет назад и уперлись в огромное количество проблем. Если верить презентациям, все нужные технологии доступны и должны работать очень гладко. Но взаимодействуя с API, на каждому углу мы обо что-то спотыкались. Поддержка PWA зависит от платформы (iOS / Android) и версии браузера. В Android Google Chrome поддерживает большинство нативных функций для PWA, а вот в iOS ограничений в самой системе, связанных с безопасностью, больше.
Сейчас видно, что год от года ограничений у того же Apple становится меньше, устройства у пользователей, а значит и версии ОС, обновляются. В итоге PWA все больше похожи на нативные приложения, а мы взялись таки за разработку. В этой статье рассказываем о том, с чем нам пришлось столкнуться.
PWA - веб-приложение с поддержкой ряда нативных функций: можно запускать камеру, использовать отпечатки пальцев, получать Push-уведомления и реализовывать на их основе различные пользовательские сценарии. Выглядит оно как классическое мобильное приложение, в частности позволяет создать ярлык на рабочем столе и не отображать строку браузера. Однако, у него есть некоторые особенности установки и настройки. Приложение скачивается не с Apple Store или Google Play, а с сайта банка, и кроме того имеет некоторые ограничения при работе с нативными функциями.
Почему PWA
PWA как технология выгодна по нескольким причинам.
Во-первых, Progressive Web Application позволяет обойти ограничения на сторах. Для банковской сферы это очень актуальная проблема. Отрасль нащупала некоторые альтернативные решения, которые больше похожи на танцы с бубном:
Приложение можно выложить на сайте банка. Но способ этот не полностью заменяет стор: не все пользователи Android готовы идти на сайт и скачивать установочный файл. А для iOS такая установка вообще невозможна.
Если банк ранее покупал коллег по рынку, которые не попали под санкции, можно воспользоваться их “брендом”, чтобы разместить приложение в официальных магазинах. Но это сложно, путанно и приложение все равно может быть заблокировано.
Можно разместить приложение под названием, напрямую не связанным с банком. Но тут встанет вопрос клиентского доверия - у людей, появляются сомнения, что именно они устанавливают.
Если посчитать затраты банка, в условиях санкций ставить клиентам нативные приложения любым из этих путей дорого. С PWA мы фактически получаем еще один вариант веб-сайта, который решает ту же задачу проще и дешевле.
Во-вторых, PWA позволяет сэкономить ресурсы разработки благодаря простоте и кроссплатформенности. Мы фактически делаем одно веб-приложение и получаем версии под разные платформы. А изменения можно вносить один раз и они будут доступны сразу на всех платформах. Не нужно ничего придумывать с синхронизацией разработки под Android и iOS или поддержкой на бэкенде нескольких версий нативного приложения, когда эта синхронизация провалилась.
Под PWA мы можем сформировать меньшую команду.
Чтобы получить нативные приложения под все платформы нужно было несколько команд. В нашем случае (два года назад) это была команда фулстек, которая реализовывала веб и его бэкенд, команды платформ - отдельные для Android и iOS, а также еще одна команда, которая делала BFF слой на бэкенде для нативного фронта.
Для PWA команда бэка все также нужна, но помимо нее в общем случае требовалась только одна команда веба, которая делала верстку PWA для Android и iOS. А мы обходились всего одной командой фулстеков, даже с учетом нюансов поддержки нативных функций на разных платформах.
При выборе в пользу PWA стоит учитывать и состав команды. Технология эта достаточно простая, так что джуны под надзором более опытных разработчиков могут войти в проект довольно быстро. От них при этом не требуется никаких необычных навыков. Наши сениоры отмечали, что их присутствие создает более продуктивную атмосферу в коллективе - есть, для кого делать хорошо.
Взвесив все за и против, клиент принял решение переходить на PWA.
В roadmap было заложено три основных этапа: MVP, MMP и готовая версия. Но начали мы с разработки дизайн-системы.
Дизайн система
Вне зависимости от используемого цифрового канала у клиента должен быть единый паттерн работы с банковскими услугами. Разработка дизайн-системы позволила оптимизировать данный процесс. По сути дизайн-система - это набор компонент, из которых достаточно быстро можно собирать экраны приложения (клиентские сценарии) без больших трудозатрат на программирование. Их можно легко интегрировать с бэкендом и выкатывать на клиентов, чтобы как можно быстрее начинать тестировать гипотезы.
Дизайн отдельных элементов делали в Figma, а разрабатывали дизайн-систему, используя StoryBook (https://storybook.js.org/). Это приложение React, которое показывает компоненты на разных страницах. По сути оно позволило дизайнерам заходить в систему и контролировать воплощение дизайна - насколько система соответствует изначальной задумке. Так они могли непосредственно влиять на качество.
Дизайн-систему писали коллеги, которые имели опыт как в дизайне, так и в разработке. Это очень положительно сказалось на ее качестве, поскольку они применили разные интересные паттерны, вроде atomic design.
В целом по рынку мы заметили тенденцию, что если раньше бизнес приветствовал расширение компетенций на соседние сферы разработки, например между фронтом и бэком, то сейчас аналогичный процесс наблюдается между разными профессиями, в частности, разработчиками и дизайнерами. Разработчики с навыками дизайна и дизайнеры с навыками разработки приносят в проект интересные идеи. И мы стараемся в компании следовать этому тренду.
MVP
Разработку MVP мы запустили в начале сентября 2023 года, а в конце января 2024 выкатили первую версию.
На этом этапе было реализовано:
Аутентификация: быстрый логин и связанные с этим сценарии - забытый пароль или логин.
Дизайн главной страницы, где отображаются счета и продукты.
Базовые функции: отображение остатков по счетам, история операций, а также самый сценарий перевода между своими счетами.
Сканер номеров карт и QR кодов для оплаты по СБП. На тот момент распознавали только 70% квитанций и 40% номеров карт, при этом сам функционал оплаты пока не работал.
На этапе MVP мы оттачивали работу PWA с разными браузерами и моделями телефонов. Пришлось разбираться, какая версии ОС стоит на клиентском устройстве и как включить в настройках браузера нужную функцию. По требованиям заказчика мы должны были поддерживать довольно старые версии iOS и Android. Но функции PWA реализованы не во всех устаревших версиях браузеров.
На этом этапе сильно помогло, что у нас в офисе есть достаточно большой парк устройств - как новых, так и старых. Гипотезы проверяли на большом многообразии смартфонов. Если на какой-то версии браузера что-то не работало, приходилось придумывать свое кастомное решение - доставать эмуляторы и фиксировать проблемы, описания которых нет на StackOverflow.
Некоторые проблемы требовали перестройки пользовательских сценариев. Например, есть такое ограничение безопасности - если пользователь не сделал никакого действия (не ткнул в экран), то клавиатура не появится. Часть Web API требует Media index. Поэтому все сценарии, подразумевающие ввод данных с клавиатуры, перерабатывали так, чтобы человеку нужно было нажать в окно или на кнопку на экране.
Обновление PWA
Отдельно стоит поговорить про обновление приложения. Выше мы упоминали, что быстрое обновление - одно из преимуществ PWA. Но тут тоже важны нюансы. Для пользователя обновление выглядит как рефреш страницы, причем не такой уж быстрый.
Сначала мы сделали обновление через стандартный диалог: “Хотите обновить? Да / Нет”. Но обновления приходят довольно часто, поэтому диалоги всем надоели еще на этапе разработки MVP. Так мы пришли к идее обновляться в фоне.
Проблема в том, что обновление прерывает пользовательский ввод. Допустим, мы запросили биометрию, в этот момент происходит рефреш. В таком случае биометрию пользователю придется “предъявлять” заново. Поэтому мы сделали обновление после логина, когда пользователь переходит на страницы, где нет никакого ввода (главная страница, страница настроек).
Сканирование QR-кодов
Пожалуй, сканер был самым сложным элементом - реализовать его в PWA оказалось нетривиально. У нас были достаточно высокие требования со стороны заказчика - приложение должно распознавать не менее 95% квитанций, которыми пользуются клиенты банка. Иными словами, мы работали на то, чтобы PWA было не хуже привычного нативного приложения.
Для распознавания QR-кодов мы использовали стороннюю on-premise библиотеку от одного из лидеров рынка, написанную на C++ и скомпилированную в WebAssembly. Изначально мы не закладывали ресурсы на аналитику и разработку того, как выбирать камеру, как обеспечивать фокусировку и т.п. Но на это пришлось потратить определенное время. Библиотека просто парсила готовые картинки с помощью встроенной нейронной сети, а процесс их получения был на нашей стороне.
Наша реализация работает в двух потоках следующим образом:
Оказалось, что не так просто определять, какой камерой нужно сканировать QR-код. Устройства отличаются, каждое имеет свое количество камер. В iPhone встречается три камеры, а в некоторых аппаратах Android - пять или шесть (считая фронтальные). Каждая из них имеет свои параметры - широкий или узкий угол, диапазон фокусировки.
API предоставляет список камер, но нигде не отражено, какая из них лучше подойдет под задачу. У некоторых устройств для камер есть флаг FacingMode, который показывает, в каком направлении “смотрит” камера (селфи-камера или обычная). Но к сожалению, он доступен не везде. Проблема и ее решение описаны на StackOverflow. Мы оставили пользователям на всякий случай возможность переключить камеру при необходимости и запоминаем этот выбор на будущее в Local Storage.
Тестирование
Для тестирования PWA вместо классической команды на стороне разработки мы пришли к полной автоматизации. Практически полностью реализовали в автотестах пирамиду тестирования (юнит-тесты, снэпшоты, интеграционные тесты, end-to-end тесты) с высоким уровнем покрытия. По тем же юнит-тестам в соответствии с требованиями заказчика у нас покрытие 80%. Кроме того подключили сервис для отслеживания качества кода - Sonarqube.
Ручное тестирование подключалось у нас уже со стороны банка на стадии приемки. Это ускорило и удешевило разработку.
В ходе тестирования мы экспериментировали не только с самими функциями приложения, но и со связью. В отличие от веб-сайта, PWA хороши тем, что при полном отсутствии интернета пользователь видит не белый экран, а интерфейс, в котором он до этого находился. При восстановлении подключения он может продолжить работу с того же места, где остановился. Нашему приложению для работы достаточно уровня сигнала “Edge”.
MMP
На этапе MMP мы реализовали основные функции daily banking и отображения банковских продуктов - вкладов, накопительных счетов и кредитов. Добавили полноценную поддержку платежей по СБП, повысили скорость и стабильность работы. Кроме того добавили поддержку программ лояльности - кэшбэка и баллов.
На этом же этапе мы встраивали сбор метрик по вопросам безопасности и “здоровья” приложения, а также по различным пользовательским сценариям, которые формируют воронки на стороне банка. Это инструмент уже для бизнеса - для повышения качества и количества цифровых продаж.
Версию MMP мы закончили к началу июля 2024 года.
Для теста мы выпустили приложение на ограниченную аудиторию в 10 тыс. пользователей. 4 тыс. - это сотрудники банка, а еще 6 тыс. - внешние пользователи.
Интересно, что именно эти 6 тыс. оказались самыми эффективными тестерами. Мы ожидали более активного отклика от сотрудников банка, поскольку это лояльная аудитория, которая может в достаточном объеме совершать типовые операции и не боится рассказать про проблемы. Но так совпало, что как раз в момент выпуска приложения банк активно работал со студентами - проводил выездные сессии в вузах, раздавая карты для выплаты стипендии. Вместе с картами сотрудники распространяли короткий гайд, как установить себе PWA и какие задачи с его помощью можно решать.
Студенты оказались очень лояльными тестерами. У них почти не было вопросов по онбордингу - это поколение, которое выросло на смартфонах и понимает, как что работает.
По итогам теста со всех 10 тыс. человек мы получили лишь несколько негативных отзывов, которые сводились к тому, что относительно нативного приложения для смартфона изменился дизайн и пользователю непросто сходу сориентироваться в новом интерфейсе.
Полная версия
Переходя к полной версии, мы продолжили работать над скоростью и стабильностью, а заодно повысили детализацию отображения различных услуг. Попутно запустили витрину, чтобы из PWA можно было открывать сложные продукты - вклады под различные ставки. Реализовали даже калькулятор, где под свои условия можно было сравнить несколько вариантов вкладов, чтобы выбрать наиболее выгодный.
Был интересный кейс, связанный с подтверждением учетной записи на Госуслугах. На этапе обсуждения проекта мы обращались к статистике банка и на тот момент этой функцией практически никто не пользовался. Но стоило нам выпустить MMP, все стали говорить, что именно ее и не хватает. В полной версии мы ее реализовали и действительно трафик на эту функцию существенно вырос.
Тестирование ограниченной аудиторией закончилось вместе с выпуском полной версии приложения - в начале ноября 2024 года. В этот момент мы открыли приложение для всех пользователей банка. У нас уже были написаны дополнительные скрипты для колл-центра, чтобы операторы могли объяснить пользователям, как с этим правильно работать. Вопросов по онбордингу было довольно много - в основном от аудитории 35+.
Что дальше?
В общей сложности с учетом относительной “новизны” решения для нас самих разработка заняла 14 месяцев. Это очень сжатый срок для такой большой задачи и маленькой команды.
Мы продолжаем развивать приложение и сейчас сосредоточились на том, чтобы сократить количество экранов, которые необходимо пройти пользователю до получения услуги. Например, если у него есть предпочтительный банк в СБП, мы сразу представляем его в интерфейс перевода, чтобы не пришлось ничего выбирать из выпадающего списка.
А также:
Движемся в направлении расширения возможностей digital-офиса, чтобы через приложение можно было заказать все основные справки даже по сложным продуктам - остатки по счетам, справки для консульства, налоговой или о закрытом кредите.
Работаем над реализацией безбумажного офиса, т.е. над возможностью подписывать присланные из банка документы в электронном виде прямо в приложении.
Продолжаем развивать интеграцию с налоговой и Госуслугами, чтобы можно было выполнять основные операции или подтверждать паспортные данные без личного визита в офиса банка.
Вывод
Поддержка PWA в браузерах определенно развивается. Еще два года назад реализовать подобное приложение было бы сложно. Сейчас у нас все получилось. Но работы пришлось проделать много - было множество реквестов, что что-то хорошо работает на iOS, но не работает под Android, и наоборот. Мы же старались решать все эти проблемы так, чтобы код на обеих платформах был одинаковый - не хотели уходить от унификации. В целом это интересный опыт, который для нас еще не закончился.
Спасибо за помощь в подготовке материалов нашей команде PWA-разработки:
Евгению Евдокимову, лиду разработки Липтсофт,
Дмитрию Державину, фронтенд-разработчику Липтсофт.
Комментарии (13)
nerudo
27.01.2025 14:54Между тем, результат оказался хуже, чем старая web-версия банк-клиента для физ. лиц. Вы упорно пытались сделать из моего 27" монитора 6-дюймовый смартфон и вам это удалось. На экране помещается значительно меньше информации в целом. В истории отсекается назначение платежа до какого-то количества первых символов (это выглядит очень смешно, когда несколько платежей совершается в адрес казенных структур, где сперва идет длинное предисловие в виде "Комитет финансов...", а все самое интересное в виде реального адресата платежа на экран не попадает - приходится тыкать в каждый пункт). В той же истории смешаны платежи, произведенные из банк-клиента и оплата карточкой на кассе в магазине.
Просто отрезана часть функционала, например комментарии к платежам, где можно было сохранить памятку себе лично.
Отдельно пропердолило экспорт истории:Совпадающие имена xls-файлов выписки по счету для разных номеров счетов
отсутствие xls для накопительного счета
Сортировка дат только в возрастающем направлении (в то время как в самом приложении они показываются наоборот в убывающем).
Вход предлагается по номеру телефона. Переключиться на вход по логину - нужно специально жамкнуть. В виде статической ссылки не получить (я уж не говорю о том, что вход по номеру телефона и вовсе хотелось бы отключить).
Единственный плюс - поддержка qr-кодов. Здорово, но пока до сих пор не понадобилось воспользоваться.
Ну и самое прекрасное (тут, наверное, вопрос к самому банку, а не разработчикам) - старую версию интернет банка прикрыли и оставили только новую.
PS И да, я оставил замечания о новой версии через обратную связь.
gusmascha
27.01.2025 14:54Добрый день!
У нас был подход “mobile first“ в сочетании с адаптивной версткой, так как первостепенная цель проекта была заменить десктоп, при этом максимально сохранить клиентский опыт работы именно мобильным приложением. Поддержка «резиновой верстки» планируется осуществить в дальнейшем, если она будет востребована пользователями. Мы собираем ОС и составляем план развития, изменения внешнего вида, сценариев, добавление функционала.
Сейчас в приложении реализован набор наиболее востребованного функционала, так, например, мы реализовали xls-файлы для депозитов. В следующих итерация функционал может и будет расширен, мы идем поступательными шагами.
Чтобы получить что-то новое, нужно отказаться от чего-то старого. С нашей стороны будет стараться придерживаться ожидаемого уровня качества сервисов. В этом нам очень помогает Ваша ОС.
nerudo
27.01.2025 14:54Ок. Продолжим.
Каждый раз при входе требует установить пин. Есть кнопка "не сейчас", но нет кнопки "никогда"
Подтверждение по смс-коду где-то требует нажатия кнопки или Enter, где-то срабатывает по последней цифре. И превый вариант, на мой взгляд, более здравый.
Состояние счета на главной странице не обновляется при хождении по меню, нужно явно нажимать Обновить в браузере
Если у вас есть доступ к старой версии интернет-банка - там можно было поставить иконку. Верните мне сердитого моржа. Именно так я смотрю на вот это все.
gusmascha
27.01.2025 14:54Спасибо за уточнения, я передам комментарии команде разработчиков. Надеюсь, что в новой версии приложения Вам захочется сменить аватарку на довольного моржа :)
MinimumLaw
27.01.2025 14:54У нас был подход “mobile first“ ... поддержка «резиновой верстки» планируется осуществить в дальнейшем, если она будет востребована пользователями.
Простите, а вам и вашим руководителям не кажется эта ситуация странной?
Вы по факту создали все условия для того, что бы убить десктоп версию как таковую. Право слово - пользоваться тем, что есть сейчас с ПК просто нереально и неразумно. Совершенно очевидно, что это самое неудобное и неразумное и востребовано не будет.
Да, безусловно - мобильная версия более востребована. А дальше мяч на вашей стороне. Но, возможно, при таком подходе ПК-версию проще сразу пристрелить. Чтоб не мучалась сама и не мучала пользователей.
Quqas
27.01.2025 14:54как "жертва" этой разработки для физ.лиц аплодирую стоя
при выборе счёта тупо нет данных начисления процентов на него
увидеть их можно только в общей "истории"
на все деньги обнова.... в старом всё было нативней - но нет же, даже если и зайти через хак в старый, физ.лиц на новьё кидает
Pixelcraftsman
27.01.2025 14:54В целом, переходы между экранами почти не заметны, хотя конечно в нативе шустрее все летает. Как альтернатива бегатне за новым "фейковым" iOS-приложением PWA-точно лучше, особенно учитывая вероятность попадания на фишинг. Тк у меня основной телефон android, то продолжу пользоваться нативом там, но PWA-адаптивная версия заменившая десктоп - гуд, тк теперь узнаваемо все после мобилки
naimjon94
27.01.2025 14:54А можно ссылку для какого банка разработали, интересно посмотреть что в итоге вышло?
MinimumLaw
Уважаемые разработчики, а скажите с чем связан отказ от приложений-аутентификаторов с генерируемыми паролями в пользу СМС? И да, функционал подрезали... В целом пользоваться на телефоне можно, но классический интернет банк жалко. Было удобнее. Тот же фильтрованный экспорт истории операций в виде таблицы был очень хорош. Да и регулярные переводы были удобнее.
И ещё - а проблема с СБП при включенном входе с приложением была связана с этим переходом?
adekina Автор
Добрый день, мы собираем ОС и собираем статистику по разным обращениям, пока опция с аутентификатором не очень востребована, но измерять продолжим.
Наша задача сделать переход максимально бесшовным, чтобы пользователям было комфортно и привычно работать с новым решением. Если неполадка у Вас повториться – стоит обратиться в службу поддержки банка – например через чат в самом приложении.
Мы будем развивать новый продукт и делать его максимально удобным для пользователей. И спасибо большое за обратную связь!
MinimumLaw
Спасибо за ответ. Он, в целом, вполне ожидаем. И хорошо, что получен.
Давайте пройдемся по списку. Опасность использования СМС в качестве второго фактора - штука известная. Атаки на ОКС, уязвимости MITM, это не говоря о недоступности сотовой сети или проблемах на стороне сотового оператора. К сожалению, этот второй фактор избыточно распиарен как надежный и гарантированно безопасный. А напрасно. Даже на Хабре есть матералы (например вот или вот). А про аутентификаторы говорят гораздо меньше....В принципе понятно - приложение, сканер кода против давно привычного СМС. Но это это гарантированно не менее безопасный второй фактор (а по факту как раз сильно более безопасный). Впрочем, давайте отдам должное банку Санкт-Петербург. По внедрению этого второго фактора вы обогнали даже Яндекс, не говоря о других банках. Но в декабре вдруг сообщается - признано устаревшим и вскоре поддерживаться не будет, кто использует возвращайтесь к СМС. Было обидно, непонятно, и довольно неприятно.
Что до чата поддержки в приложении, то... Хабр не жалобная книга, но могу скрины показать. Вопрос о том, что у меня (а равно у других людей, использующих для входа приложение-аутентификатор) не работают переводы людям через СБП задавался с регулярностью сначала 3 месяца, потом пол года, потом год. И минимум два года эта функциональность не работала. Подозреваю что не работает и до сих пор, но... Я внял вашим рекомендациям и сменил подтверждение на СМС. Даже наступив на собственное горло. Потому уверенно утверждать не могу. И это при том, что СМС все же ходили. Часть операций можно было подтвердить только СМС. Где-то полгода назад починили платежи по QR-коду. Ну как починили... Полагаю что договорились с СБП о том, что можно без СМС. Было уже что-то, но переводы людям так и остались висеть.
В любом случае опыт общения в чате, с нерешаемым вопросом в течении двух лет (и не просто вопросом, а одним из важных вопросов, ибо переводы через СБП очень востребованы) - он отбивает всякую охоту туда писать. Впрочем, под самый новый год мне именно в чате подсказали где именно нужно нажать, чтобы получить выписку в формате электронной таблицы. В старом варианте эта кнопка была расположена очень логично и удобно, в новом спрятана. К тому же теперь возможен только экспорт всех операций. Ранее была возможность задать фильтр и экспортировать только интересующие. Не великая проблема - отфильтровать можно и табличным процессором, но... кто же любит лишние движения?
В любом случае спасибо за ответ. Очень надеюсь на то, что задуманное вами получится и на выходе будет действительно удобное и быстрое приложение.
adekina Автор
Спасибо Вам за столь подробный комментарий, я обязательно передам все нашей команде разработчиков. Ваша ОС действительно важна.