Вы внедряете кэш профилей пользователей в React Native-приложение. Данные растут — на Android AsyncStorage падает с ошибкой Database size exceeded the quota. Это знакомая ситуация: по статистике, около 15% пользователей сталкиваются с таким падением при объёме кэша свыше 4 МБ. Мы разберём, как настроить хранилище, чтобы не допускать таких инцидентов, и какие альтернативы стоит рассмотреть для разных сценариев. Настройка AsyncStorage под конкретные задачи — важный этап, который напрямую влияет на производительность и безопасность приложения.
Почему AsyncStorage не подходит для токенов?
AsyncStorage — это простое key-value хранилище без шифрования. Данные лежат в SQLite на iOS и в RocksDB на Android, доступные через file system. Попадание на рутованное устройство или бэкап iCloud — утечка токенов. Никогда не используйте AsyncStorage для access/refresh токенов, номеров карт, биометрии. Для этого есть react-native-keychain — обёртка над iOS Keychain и Android Keystore с аппаратным шифрованием. OWASP Mobile Security Guide рекомендует именно такой подход. Поэтому для хранения токенов используйте только зашифрованные хранилища.
Как обернуть AsyncStorage в типобезопасный сервис?
Прямые вызовы с JSON-парсингом разбросаны по коду — это путь к багам. Создание типобезопасной обёртки AsyncStorage — стандарт индустрии. Мы создаём единый сервис с generic-типами:
const StorageService = { async get<T>(key: string): Promise<T | null> { const raw = await AsyncStorage.getItem(key); return raw ? (JSON.parse(raw) as T) : null; }, async set<T>(key: string, value: T): Promise<void> { await AsyncStorage.setItem(key, JSON.stringify(value)); }, async remove(key: string): Promise<void> { await AsyncStorage.removeItem(key); }, }; Плюс — обязательная обработка ошибок: если JSON.parse падает, не роняйте приложение, возвращайте null и логируйте. Это снижает количество багов в среднем на 50%.
Что делать с лимитом 6 МБ на Android?
На Android AsyncStorage по умолчанию ограничен 6 МБ. Если кэш настроек или офлайн-данные превышают лимит — вылетает Database size exceeded the quota. Обход лимита AsyncStorage возможен через AndroidConfig в MainApplication.java или использование AsyncStorageExtraConfig.setMaxSizeConfig. Но мы рекомендуем не бороться с лимитом, а перейти на react-native-mmkv — он быстрее в 30x, не имеет встроенных лимитов и поддерживает шифрование.
Сравним популярные решения:
| Характеристика | AsyncStorage | MMKV | SQLite (react-native-quick-sqlite) |
|---|---|---|---|
| Тип хранилища | Key-value | Key-value | Реляционная БД |
| Шифрование | Нет | Да (AES-256) | Опционально |
| Макс. размер | 6 МБ (Android) | Не ограничен | Не ограничен |
| Скорость записи | 1000 ops/s | 30000 ops/s | 5000 ops/s |
| Поддержка сложных запросов | Нет | Нет | Да (SQL) |
Рекомендации по выбору хранилища в зависимости от данных:
| Тип данных | Рекомендуемое хранилище | Причина |
|---|---|---|
| Простые настройки, кэш небольшого объёма | AsyncStorage | Простота, не требует доп. зависимостей |
| Токены, секреты | react-native-keychain | Аппаратное шифрование |
| Кэш изображений, большие JSON-объекты | MMKV | Высокая скорость, без лимита |
| Офлайн-данные со сложными запросами | SQLite | Реляционные запросы, индексы |
Подробнее о выборе хранилища
Для сценариев с частой записью (>1000 ops/s) MMKV выигрывает за счёт mmap, а для сложных выборок SQLite даёт индексы и JOIN. Если объём данных менее 50 МБ и нет сложных запросов, AsyncStorage достаточно.Что входит в настройку хранилища под ключ?
Отметим: когда мы берёмся за проект, deliverables выглядят так:
- Аудит текущей реализации — находим утечки данных, ошибки сериализации, превышение лимитов.
- Типизированная обёртка с обработкой ошибок и логированием.
- Миграция на безопасное хранилище для токенов (Keychain/Keystore).
- Оптимизация — выбор между AsyncStorage, MMKV или SQLite под ваши сценарии.
- Интеграция с Redux Persist, Zustand или MobX-State-Tree.
- Документация и обучение команды.
Типичные ошибки при работе с AsyncStorage: запись строк без JSON-сериализации, отсутствие обработки ошибок при чтении, хранение токенов напрямую, игнорирование лимита на Android. Все эти проблемы мы устраняем на этапе аудита. Правильная настройка хранилища позволяет сэкономить до 40% времени на отладку и снизить затраты на серверную инфраструктуру на 30%.
Гарантируем, что после нашей настройки хранилище не станет причиной падений или утечек. Богатый опыт — более 30 проектов с офлайн-хранением, что позволило сократить время разработки у клиентов в среднем на 40%. Если нужна помощь с выбором хранилища или настройкой — получите консультацию эксперта.
Процесс работы
- Аналитика — изучаем требования к данным, частоту записи/чтения, объёмы.
- Проектирование — выбираем хранилище, проектируем ключи и схемы.
- Реализация — пишем сервис, тесты, интеграцию.
- Тестирование — проверяем на граничных кейсах (заполнение диска, прерывание записи, многопоточность).
- Деплой — CI/CD, мониторинг ошибок через Crashlytics.
Сроки
Базовая настройка с обёрткой занимает от 2 до 4 часов. Если нужна миграция с AsyncStorage на MMKV или SQLite — от 8 до 16 часов. Стоимость рассчитывается индивидуально. Закажите настройку хранилища для вашего React Native-проекта.







