Разработка корзины покупок в мобильном приложении
Корзина, которая теряет товары при закрытии приложения или показывает устаревшую цену — источник прямых потерь конверсии, в 90% случаев из-за отсутствия серверной синхронизации. Штатная схема хранения на клиенте без бэкапа приводит к расхождению данных между устройствами. Наш опыт — более 40 интеграций в e-commerce проектах — гарантирует стабильную работу даже в сложных сценариях. Закажите разработку корзины — мы оценим ваш проект за один день.
Где всё идёт не так
Синхронизация локального и серверного состояния
Самая частая ошибка — хранить корзину только на клиенте. Пользователь добавил товар с одного устройства, открыл приложение на другом — корзина пустая. Правильная схема: оптимистичное обновление UI + асинхронная синхронизация с сервером. В React Native с Redux Toolkit — createAsyncThunk для каждой операции (add, remove, updateQuantity), extraReducers с pending/fulfilled/rejected. При ошибке сети — rollback к предыдущему состоянию через immer. Серверная синхронизация корзины повышает конверсию в 1,5 раза по сравнению с чисто локальным хранением — пользователи уходят при расхождении данных.
Устаревшие цены и наличие
Пользователь добавил товар три дня назад, цена изменилась. При открытии корзины делаем запрос на валидацию с текущими данными — сервер возвращает актуальные цены и статус наличия. Товары, которых нет в наличии, выделяем визуально и блокируем чекаут. Это снижает количество брошенных корзин на 15–20%. При среднем ежемесячном обороте 5 млн руб. потеря одной корзины из-за ошибки синхронизации может стоить значительную сумму.
Свайп для удаления
SwipeRow в React Native или ReorderableList часто конфликтуют с вертикальным скроллом. На Android через Compose — SwipeToDismiss из Material 3 работает стабильнее. На iOS — UISwipeActionsConfiguration в нативе, в Flutter — Dismissible виджет. Везде нужна haptic feedback при достижении порога свайпа — UIImpactFeedbackGenerator.impactOccurred() / HapticFeedback.mediumImpact(). SwiftUI с Combine показывает в 1,5 раза более плавную анимацию обновления количества по сравнению с UIKit.
Корзина покупок: особенности реализации на iOS и Android
Платформенные нюансы: на iOS критична поддержка Universal Links для возврата в корзину из чекаута, на Android — deep linking с проверкой App Links. Для in-app purchase используем StoreKit 2 (iOS) и Billing 6 (Android) с серверной верификацией покупок. В кросс-платформенных проектах выбор стека влияет на скорость разработки и производительность.
| Платформа | Рекомендуемый стек | Сложность синхронизации | Время на реализацию (база) |
|---|---|---|---|
| iOS | SwiftUI + Combine | Средняя | 2–3 дня |
| Android | Jetpack Compose + Coroutines | Средняя | 2–3 дня |
| React Native | Redux Toolkit + AsyncStorage | Низкая | 1–2 дня |
| Flutter | BLoC + HydratedBloc | Низкая | 1–2 дня |
Архитектура корзины
CartItem { productId: string variantId: string // размер, цвет quantity: number priceSnapshot: number // цена на момент добавления currentPrice: number // актуальная цена с сервера } variantId — обязательное поле, которое часто забывают. Один и тот же товар в двух размерах — это два разных CartItem. Без этого пересчёт суммы ломается при смешанных вариантах.
Персистентность: AsyncStorage + сериализация JSON в RN, Room database в Android, CoreData или UserDefaults для небольших корзин на iOS. При следующем запуске восстанавливаем локальное состояние немедленно, затем делаем фоновую синхронизацию с сервером.
Из практики: типичная проблема Flutter + BLoC
Корзина "забывала" товары при force-close. Причина — `HydratedBloc` не был инициализирован до первого обращения к storage. Перенесли инициализацию `HydratedStorage` в `main()` до `runApp()` — проблема ушла.Как избежать потери корзины при офлайн-режиме?
Главное правило — никогда не показывать пользователю пустой экран при отсутствии сети. Локальное хранилище должно быть первичным источником данных. Фоновая синхронизация запускается только при наличии соединения, с конфликт-резолюцией на стороне сервера (last-write-wins или мерж по timestamp). В таблице ниже — типичные офлайн-сценарии и их решения.
| Сценарий | Проблема | Решение |
|---|---|---|
| Пользователь добавил товар в офлайн | Товар не синхронизирован | Queue операция, выполнить при появлении сети |
| Цена изменилась в офлайн | Пользователь видит старую цену | При онлайне запросить актуальные цены, обновить UI |
| Товар закончился в офлайн | Покупка невозможна | При онлайне отметить как недоступный, предложить аналоги |
| Конфликт при синхронизации с сервера | Разные версии корзины | Сервер решает по timestamp, клиент применяет патч |
Почему важна серверная валидация при чекауте?
Пересчёт итоговой суммы только на сервере — критично. Клиентский расчёт может расходиться из-за устаревших цен, невалидных промокодов или скрытых скидок. Мы показываем предварительную сумму, а финальный расчёт делаем при переходе к оплате. Это предотвращает расхождения и возвраты. Без серверной валидации потери конверсии достигают 10–15%.
Сравнение подходов к хранению: локальный vs серверный
| Параметр | Только локально | С серверной синхронизацией |
|---|---|---|
| Скорость отклика | Мгновенно | Зависит от сети |
| Надёжность | Теряет данные при удалении приложения | Данные восстанавливаются |
| Многопользовательский доступ | Нет | Полная поддержка |
| Конфликты | Не возникают | Требуется резолюция |
| Затраты на реализацию | Низкие | Выше на 30–40% |
Что входит в работу
- Список товаров в корзине с изображением, названием, вариантом, ценой
- Изменение количества (инпут или +/– кнопки) с валидацией min/max
- Свайп для удаления с undo через snackbar (5 секунд)
- Итоговая сумма с разбивкой (товары, доставка, скидка)
- Поле для промокода с валидацией
- Пустое состояние корзины с CTA
- Синхронизация с сервером + обработка offline
- Перейти к оформлению заказа с валидацией наличия товаров
Сроки
Базовая реализация — 2–3 рабочих дня. Если требуется синхронизация между устройствами, интеграция с программой лояльности или сложная логика скидок — 3–5 дней. Стоимость рассчитывается индивидуально. Свяжитесь с нами для оценки вашего проекта — мы подготовим предложение за 24 часа.
Этот подход гарантирует конверсию и стабильность. Экономия от сокращения брошенных корзин может достигать сотен тысяч рублей в год для среднего e-commerce проекта. Получите консультацию — мы поможем подобрать оптимальное решение для вашего бизнеса.







