AsyncStorage у React Native: типобезпека, ліміти та альтернативи
Ви впроваджуєте кеш профілів користувачів у 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%.
Гарантуємо, що після нашого налаштування сховище не стане причиною падінь або витоків. Понад 10 років досвіду та більше 30 проектів з офлайн-зберіганням, що дозволило скоротити час розробки у клієнтів в середньому на 40%. Якщо потрібна допомога з вибором сховища або налаштуванням — отримайте консультацію експерта.
Процес роботи
- Аналітика — вивчаємо вимоги до даних, частоту запису/читання, обсяги.
- Проектування — вибираємо сховище, проектуємо ключі та схеми.
- Реалізація — пишемо сервіс, тести, інтеграцію.
- Тестування — перевіряємо на граничних кейсах (заповнення диска, переривання запису, багатопотоковість).
- Деплой — CI/CD, моніторинг помилок через Crashlytics.
Строки
Базове налаштування з обгорткою займає від 2 до 4 годин. Якщо потрібна міграція з AsyncStorage на MMKV або SQLite — від 8 до 16 годин. Вартість розраховується індивідуально. Замовте налаштування сховища для вашого React Native-проекту.







