Ответ
Разрабатывал мобильное банковское приложение (iOS) для крупного финансового учреждения. Основная цель — предоставить клиентам полный спектр услуг: просмотр балансов, история операций, денежные переводы, оплата услуг и управление картами.
Технический стек и архитектура:
- Архитектура: MVVM-C (Model-View-ViewModel-Coordinator) для разделения ответственности и навигации.
- UI: Гибридный подход — новые модули на SwiftUI, легационные экраны на UIKit.
- Реактивность: Combine для биндинга данных между ViewModel и View.
- Сеть:
URLSessionс оберткой, использующей async/await, и Codable для парсинга JSON. - Локальное хранилище: Core Data с оптимизированной моделью для кэширования истории операций.
- Безопасность: Keychain Services для хранения чувствительных данных, биометрическая аутентификация.
Мой ключевой вклад:
- Разработка модуля «История операций»:
- Реализовал бесконечную ленту с пагинацией и предварительным кэшированием.
- Добавил сложные фильтры и категоризацию трат с анимациями на SwiftUI.
-
Интеграция биометрической аутентификации:
import LocalAuthentication func authenticateUser() async throws -> Bool { let context = LAContext() var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { throw AuthError.biometryUnavailable } return try await context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Войдите для доступа к счету") } - Оптимизация производительности:
- Сократил время холодного старта на 30% за счет отложенной загрузки неключевых модулей.
- Реализовал встроенный кэш изображений для аватаров контрагентов.
Процесс: Работа велась по Scrum с двухнедельными спринтами. Приложение было опубликовано в App Store и на момент моего ухода имело более 500 000 активных пользователей с рейтингом 4.8.
Ответ 18+ 🔞
Ну и вот, сидишь такой, разрабатываешь приложение для банка, ага. Не какую-нибудь хуйню с котиками, а мобильный банк для конторы, у которой денег, как говна за баней. Цель — чтоб клиент, сидя на унитазе, мог всё: посмотреть, сколько у него осталось до зарплаты, куда он всё просрал, и кому-нибудь срочно денег перекинуть, пока не передумал.
На чём всё это колхозилось, или «технический пиздец»:
- Архитектура: MVVM-C. Это чтобы не получилась одна большая ViewController-помойка, где всё свалено в кучу, как в шкафу у подростка. Координатор (этот самый «C») отвечает за навигацию, чтобы не было этих ебаных
presentиpushна каждом углу. - UI: История, как в жизни — старый хлам и новая фигня. Легаси, который писал ещё дядя Вася в 2015-м, — на UIKit. Всё новое, блядь, — на SwiftUI. Потому что «так модно, молодёжно», а на деле — два разных мира, которые надо заставить дружить. Ёперный театр.
- Как данные бегают: Combine. Ну, чтобы когда в одном месте что-то поменялось, в другом само всё обновилось, без этих вечных
reloadData(). Магия, блядь. - Сеть: Раньше писали горы кода с completion-блоками. Теперь взяли
URLSession, обернули вasync/await, и стало красиво, как в рекламе. JSON парсим через Codable — просто говоришь «эй, вот структура, будь человеком», и он, сука, заполняет. - Локальная база: Core Data. Ну, куда ж без неё. Чтобы, даже если интернет сдох, пользователь мог посмотреть, как он вчера в баре всё спустил. Оптимизировал модель, чтоб не тормозило при тысячах операций.
- Безопасность: Пароли, токены — всё в Keychain. А чтобы зайти, можно пальцем приложить или лицо показать. Удобно, блядь.
Что я там такого наворотил, пока не свихнулся:
- Модуль «История операций»: Это не просто табличка. Это, блядь, бесконечная лента. Листаешь, листаешь, а оно подгружает новое, как в соцсетях. И всё кэшируется, чтоб не дергать сервер каждые пять секунд. Добавил ещё фильтры — можно отобрать платежи только за шаверму, например. С анимациями на SwiftUI, чтоб красиво было, ебушки-воробушки.
-
Вход по лицу/пальцу: Ну, стандартная тема, но надо было сделать надёжно и без косяков. Код вроде такого:
import LocalAuthentication func authenticateUser() async throws -> Bool { let context = LAContext() var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { throw AuthError.biometryUnavailable } return try await context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Войдите для доступа к счету") }Выглядит просто, а попробуй обработай все ошибки, когда у пользователя пальец грязный или он в перчатках. Пиздец, а не работа.
- Оптимизации: Приложение раньше запускалось, как паровоз из прошлого века. Я посмотрел, что грузится в самом начале, и выкинул всё, без чего можно первые пять секунд прожить. Холодный старт ускорился на 30%, чих-пых! Ещё сделал кэш для картинок — аватары контрагентов не качаются каждый раз, а лежат на телефоне.
Как мы работали: По Scrum, да. Двухнедельные спринты, ежедневные стендапы, где все говорят, что они вчера делали. Иногда казалось, что это просто ритуал, чтобы оправдать свою зарплату. Но, в итоге, приложение выкатили в App Store. И знаешь что? Оно не сдохло! На момент, когда я сваливал, там было больше полумиллиона активных юзеров и рейтинг 4.8. Вот так вот, блядь.