# Документация по мобильному приложению
Version 0.1
Version Control Table
| Date | Version | Description |
|---|---|---|
| 10.2023 | 0.1 | Innitial guide |
# Инициализация
- В начале жизненного цикла приложения происходит инициализация всех сервисов и контроллеров (например, обработчик запросов). Эти компоненты будут функционировать на протяжении всей жизни приложения.
# Иннициализация Firebase
- Инициализируются основные сервисы Firebase: Push, отлавливание ошибок и прочие.
- Получение Firebase токена, который будет использоваться на протяжении работы приложения.
# Запуск первого экрана
- Перед отображением первого экрана приложение подготавливает запрос к серверу.
- Необходимо установить куки, которые будут использоваться для последующих запросов.
- Отправляется запрос на сервер для определения следующего экрана:
- Сервер анализирует наличие сохраненного пин-кода и другие параметры.
- Если у пользователя нет сохраненного пин-кода, сервер возвращает инструкции для отображения экрана с вводом номера телефона.
- Если пин-код сохранен, сервер возвращает инструкции для отображения экрана проверки пин-кода.
- Приложение отображает соответствующий экран на основе ответа сервера.
- В случае ошибок в ответе сервера или других проблем: отображается экран ошибок.
# Последовательность запросов
- Отправляем запрос на куки
- Отправляем запрос для получения токенов
- Отправляем запрос для получения первого экрана
- Когда истекает access токен, мы делаем запрос для обновления токенов
# Последовательность запросов при пин-коде
Если у пользователя есть пинкод, то последовательность такая:
- Отправляем запрос на куки
- Отправляем запрос для получения экрана проверки пин-кода
- Если введен правильный пин-код, отправляем запрос для получения токенов
- Отправляем запрос для получения первого экрана (первый экрана зависит от процесса, в релизном процессе должен быть экран home)
- Когда истекает access токен, мы делаем запрос для обновления токенов
# Показ и управление экранами
- Основная логика отображения экранов основана на
mainControllerи функцииchangePage. - Функция
changePageотвечает за запрос нового экрана, разбиение экрана на виджеты и перенаправление на нужный экран. - Процесс работы
changePage:
# 1. Запрос экрана
- Запрашивается экран с передачей необходимых параметров.
# 2. Парсинг экшенов
- Если на экране есть кнопка или элемент с действиями (это действие, которое может быть произведено в приложении, такое как переход вперед, назад или выполнение определенного события), то эти экшены парсятся и передаются для дальнейшей обработки.
# 3. Валидация на экране
- Перед выполнением любых действий необходимо проверить наличие ошибок на экране.
- Если присутствуют ошибки валидации (например, не заполненные пользователем поля), то это обрабатывается в Error контроллере.
- При наличии ошибок выполнение функции прерывается, и запрос не отправляется.
# 4. Выполнение запроса
- Если предыдущий этап валидации прошел успешно, то отправляется запрос.
# 5. Парсинг запросов
Для обработки и парсинга запросов используются две функции:
# Config-parser
Эта функция отвечает за первоначальное преобразование данных. Она берет "сырой" JSON, полученный с сервера, и в режиме рекурсии преобразует его в структурированную форму, которую можно назвать "матрешкой из виджетов". В результате, вместо неструктурированного JSON, у нас появляется логически упорядоченная иерархия или матрешка моделей, готовая к дальнейшей обработке.
# Build widget
Эта функция берет полученную от config-parser "матрешку" и разбивает её на отдельные виджеты или компоненты. Она определяет, какой именно экран и связанные с ним элементы следует отобразить на устройстве пользователя.
# Процесс работы
- Принятый JSON с сервера сначала обрабатывается функцией
config-parser. Эта функция "читает" данные, проходя по ним рекурсивно, и формирует из них удобную для работы структуру. - После этого,
build widgetначинает анализировать полученную структуру, определяя какой экран и связанные с ним элементы (ноды) следует отобразить. - Основываясь на определенной ноде и экране, происходит переход в нужную ветку обработки. Например, если был определен экран ввода мобильного номера и соответствующая нода идентификации, то система перенаправляет пользователя именно на этот экран, где уже непосредственно происходит взаимодействие с пользователем.
# 6. Отображение элементов на экране
Для удобства работы с элементами, предоставляемыми сервером, используется централизованный словарь (glossary):
Создание словаря: Каждый элемент, полученный с сервера, сохраняется в словаре. При этом каждому элементу присваивается уникальный ключ, основанный на его имени.
Обращение к элементу: Для отображения конкретного элемента на экране, система обращается к словарю по имени этого элемента. Например, чтобы отобразить кнопку, производится запрос к словарю с ключом
button.
# Процесс работы:
- При получении данных с сервера, каждый элемент (виджет, филд и т.д.) сохраняется в словарь.
- Идентификация элементов в словаре происходит по их уникальным именам. Это обеспечивает быстрый доступ к любому элементу, а также избегает возможных конфликтов.
- При необходимости отобразить какой-либо элемент на экране, система обращается к словарю по имени этого элемента. Это позволяет мгновенно получить доступ к нужному объекту и его свойствам.
- После обращения к словарю, система перенаправляет запрос к соответствующему виджету или компоненту, где уже происходит дальнейшая обработка и отображение на экране.
# Запросы
# Отправка запросов
MakeRequest: Отправляет запросы на сервер для получения данных следующего экрана.
# Токены
В приложении используются два типа токенов:
- Access Token: Используется для доступа к ресурсам. Имеет ограниченное время жизни и может истечь. В настоящий момент время жизни составляет 3 минуты, но это значение может измениться в будущем.
- Refresh Token: Используется для обновления Access Token. В настоящий момент время жизни составляет 30 минуты, но это значение может измениться в будущем.
# Работа с токенами
Обновление Access Token: При каждом запросе к системе, мы проверяем срок действия Access Token. Если он истек, система автоматически производит его обновление.
Обработка Refresh Token:
- Если запрос отправлен без
Refresh Token, система автоматически запрашивает новый и подставляет его в запрос. - Если
Refresh Tokenистек, запрос прерывается, и пользователю показывается экран ошибки.
- Если запрос отправлен без
# Перехватчик запросов
- Любой запрос, отправляемый на сервер будет перехвачен.
- Этот механизм проверяет каждый запрос на наличие и актуальность токенов.
- Если Access Token истек, он обновляется с помощью Refresh Token.
- Если Refresh Token отсутствует, система запрашивает новый.
- Если жизнь Refresh Token истекла, запрос прекращается, и показывается экран ошибки.
# Перехватчик ошибок
- Помимо перехватчика запросов, существует перехватчик ошибок, который контролирует все ошибки, связанные с запросом.
- В зависимости от ошибки выбирается соответствующий экран для показа пользователю.
Примеры обработки ошибок
- Если истек токен: показ экрана "Сессия истекла, обновите сессию".
- Отсутствие сервиса (например, генерации OTP): "Сервис недоступен, повторите позже".
- Сложные ошибки или следующий экран с ошибкой: предложение "Вернуться на первый экран" или "Обновить экран".
# Управление экранами ошибок и загрузки. ConnectController
Наше приложение обладает функционалом для динамического управления экранами, позволяя показывать экран поверх другого экрана, в зависимости от определенных условий и событий.
У нас есть специализированный контроллер, который определяет, какой экран показать в зависимости от текущего контекста:
Основной экран: Это стандартный экран, на котором пользователь проводит большую часть времени.
Экран ошибок: Показывается поверх основного экрана, если произошла ошибка, например, проблема с интернет-соединением.
# Отображение экрана ошибок и загрузки
Функционал показа ошибок: Если произошла какая-то ошибка, например, отключение интернета, то в реальном времени пользователю показывается экран с ошибкой поверх основного экрана.
Экран загрузки (Loading screen): Когда пользователь переходит с одного экрана на другой, поверх текущего экрана показывается затемненный экран с индикатором загрузки.
# Метод changeload
Для управления отображением экранов ошибок и загрузки в приложении используется функция changeload:
В зависимости от переданных параметров, функция либо показывает экран загрузки (
loading screen), либо экран ошибки.При показе экрана ошибки, в функции происходит парсинг ошибки, чтобы определить, какой конкретно экран ошибки показать.
# Виды ошибок
Ошибка с генерацией новых экранов: При такой ошибке показывается соответствующий экран.
Ошибка с токеном: Например, если токен истек, показывается экран с сообщением о проблеме с токеном.
Неопределенные ошибки: В случае возникновения неизвестных ошибок, показывается стандартный экран ошибки.
# Экран поддержки BPMMain
Описание:
BPM Main - это экран поддержки, который служит основой для других экранов в приложении. Его главные функции:
1. Считывание свайпов
- Встроенная функциональность для распознавания жестов пользователя (свайп влево или вправо).
- После определения свайпа система решает, куда будет направлен пользователь (вперед или назад).
2. Показ экранов ошибок или загрузки
- Встроенная функция для отображения вспомогательных экранов (ошибки или загрузки) поверх основного экрана.
- По умолчанию, если нет ошибок или процессов загрузки, BPM Main представляет собой пустой (невидимый) контейнер.
- Если произошла ошибка или требуется показать экран загрузки, BPM Main активируется и отображает соответствующий экран поверх текущего.
Примечание: BPM Main экран работает как "подложка" для других экранов. То есть, если пользователь находится на экране идентификации и происходит ошибка, BPM Main отображает экран ошибки прямо поверх экрана идентификации. Если ошибок нет, BPM Main остается невидимым для пользователя.
# Рекурсивная обработка ответов от Back-end
# Описание проблемы
При работе с Back-end сервисом может возникнуть ситуация, когда в ответ на запрос ожидается экран, но Back-end вместо экрана возвращает токены.
# Решение
Для обработки данной ситуации была разработана рекурсивная функция. Её основная задача - обеспечить корректное получение экрана, даже если в ответ на запрос приходят токены.
# Алгоритм работы функции
- Отправить запрос на Back-end.
- Проверить ответ: содержит ли он экран или токены.
- Если ответ содержит экран:
- Сохранить имя экрана.
- Сохранить запрос.
- Отдать результат.
- Если ответ содержит токены:
- Сохранить копию запроса.
- Сохранить токены.
- Отправить сохраненный запрос с новым токеном.
Этот процесс будет повторяться до тех пор, пока в ответ не придет экран.
# Пример использования
При нажатии на кнопку в пользовательском интерфейсе инициируется запрос на Back-end для получения нового экрана. Если в ответ приходят токены, функция автоматически повторяет запрос до получения экрана.