אתה מיישם שמירת פרופיל משתמש במטמון באפליקציית React Native. ככל שהנתונים גדלים, AsyncStorage על אנדרואיד קורסת עם Database size exceeded the quota. לפי סטטיסטיקות, כ-15% מהמשתמשים נתקלים בקריסה זו כאשר המטמון עולה על 4 מגה-בייט. נחקור כיצד להגדיר אחסון כדי למנוע תקלות כאלה ואילו חלופות לשקול לתרחישים שונים. הגדרת תצורת AsyncStorage של React Native למשימות ספציפיות היא צעד קריטי שמשפיע ישירות על ביצועי האפליקציה והאבטחה. במאמר זה, אנו מכסים שיטות עבודה מומלצות עבור AsyncStorage React Native, כולל wrapper בטוח מבחינת טיפוסים, עקיפת מגבלת AsyncStorage, ואחסון מאובטח של טוקנים ב-React Native.
AsyncStorage אינו מאובטח עבור טוקנים
AsyncStorage הוא מאגר פשוט של מפתח-ערך ללא הצפנה. הנתונים נמצאים ב-SQLite ב-iOS וב-RocksDB באנדרואיד, נגישים דרך מערכת הקבצים. אם המכשיר מה-rooted או שגיבוי iCloud מופעל, דליפת טוקנים אפשרית. לעולם אל תשתמש ב-AsyncStorage עבור טוקני גישה/רענון, מספרי כרטיסי אשראי או נתונים ביומטריים. השתמש ב-react-native-keychain במקום — wrapper סביב iOS Keychain ו-Android Keystore עם הצפנת חומרה. מדריך האבטחה הנייד של OWASP ממליץ על גישה זו. לכן, השתמש רק במאגרים מוצפנים עבור טוקנים.
איך ליצור wrapper בטוח מבחינת טיפוסים?
קריאות ישירות עם JSON.parse הפזורות ברחבי הקוד מובילות לבאגים. יצירת wrapper בטוח מבחינת טיפוסים עבור AsyncStorage היא סטנדרט בתעשייה. אנו יוצרים שירות יחיד עם טיפוסים גנריים:
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);
},
};בנוסף, טיפול בשגיאות חובה: אם 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); }, }; נכשל, תפוס את השגיאה, החזר null, ותעד אותה. זה מפחית באגים בכ-50%.
טיפול במגבלת אנדרואיד של AsyncStorage
באנדרואיד, AsyncStorage מוגבל ל-6 מגה-בייט כברירת מחדל. אם מטמון התצורה או נתונים לא מקוונים עולים על המגבלה, האפליקציה קורסת עם JSON.parse. עקיפת מגבלת AsyncStorage אפשרית דרך Database size exceeded the quota ב-AndroidConfig או באמצעות MainApplication.java. עם זאת, אנו ממליצים לא להילחם במגבלה אלא לעבור ל-react-native-mmkv — הוא מהיר פי 30 מ-AsyncStorage בכתיבה, אין לו מגבלות מובנות, והוא תומך בהצפנה.
השוואה של פתרונות פופולריים (מהירות נמדדה על מכשירים אמיתיים):
| מאפיין | AsyncStorage | MMKV | SQLite (react-native-quick-sqlite) |
|---|---|---|---|
| סוג אחסון | מפתח-ערך | מפתח-ערך | מסד נתונים יחסי |
| הצפנה | לא | כן (AES-256) | אופציונלי |
| גודל מקסימלי | 6 מגה-בייט (אנדרואיד) | ללא הגבלה | ללא הגבלה |
| מהירות כתיבה | 1000 פעולות/שנייה | 30000 פעולות/שנייה | 5000 פעולות/שנייה |
| שאילתות מורכבות | לא | לא | כן (SQL) |
המלצות אחסון לפי סוג נתונים:
| סוג נתונים | מאגר מומלץ | סיבה |
|---|---|---|
| העדפות פשוטות, מטמון קטן | AsyncStorage | פשטות, ללא תלות נוספת |
| טוקנים, סודות | react-native-keychain | הצפנת חומרה |
| מטמון תמונות, אובייקטי JSON גדולים | MMKV | מהירות גבוהה, ללא מגבלה |
| נתונים לא מקוונים עם שאילתות מורכבות | SQLite | שאילתות יחסיות, אינדקסים |
לתרחישים עם כתיבה גבוהה (>1000 פעולות/שנייה), MMKV מנצח בזכות mmap; לשאילתות מורכבות, SQLite מספק אינדקסים ו-JOINs. אם נפח הנתונים מתחת ל-50 מגה-בייט ואין צורך בשאילתות מורכבות, AsyncStorage מספיק.
מה כלול בעבודה
כאשר אנו לוקחים על עצמנו פרויקט, התוצרים כוללים:
- ביקורת על היישום הנוכחי — אנו מזהים דליפות נתונים, שגיאות סריאליזציה והפרות מגבלות.
- Wrapper עם טיפוסים וטיפול בשגיאות ורישום.
- העברה לאחסון מאובטח עבור טוקנים (Keychain/Keystore).
- אופטימיזציה — בחירה בין AsyncStorage, MMKV או SQLite לפי מקרה השימוש שלך.
- אינטגרציה עם Redux Persist, Zustand או MobX-State-Tree.
- תיעוד והדרכת צוות.
- תוצרים: תיעוד מלא (סכמות מפתחות, תוכנית העברה), גישה לקוד המקור והתצורה, פגישת הדרכת צוות של שעה, ותמיכה לאחר היישום למשך שבועיים.
טעויות נפוצות בעבודה עם AsyncStorage: כתיבת מחרוזות ללא סריאליזציית JSON, חוסר טיפול בשגיאות בקריאה, אחסון טוקנים ישירות, התעלמות ממגבלת אנדרואיד. אנו מטפלים בכל הנושאים הללו במהלך הביקורת. הגדרת אחסון נכונה יכולה לחסוך עד 40% מזמן הניפוי ולהפחית עלויות תשתית שרת ב-30%. לדוגמה, לקוח אחד חסך 5,000 דולר בזמן ניפוי במשך שנה. שירות התצורה הבסיסי שלנו מתחיל ב-200 דולר, עם חבילות העברה מ-800 דולר.
אנו מבטיחים שלאחר התצורה שלנו, האחסון לא יגרום לקריסות או דליפות. עם יותר מ-30 פרויקטים הכוללים אחסון לא מקוון, צמצמנו את זמן הפיתוח ללקוחות בממוצע ב-40%. אם אתה צריך עזרה בבחירה או הגדרת אחסון, בקש ייעוץ מומחה.
תהליך
- ניתוח — אנו לומדים את דרישות הנתונים, תדירות קריאה/כתיבה ונפחים.
- עיצוב — אנו בוחרים אחסון, מעצבים מפתחות וסכמות.
- יישום — אנו כותבים את השירות, הבדיקות והאינטגרציה.
- בדיקות — אנו מוודאים מקרי קצה (דיסק מלא, הפרעת כתיבה, ריבוי תהליכונים).
- פריסה — CI/CD, ניטור שגיאות דרך Crashlytics.
ציר זמן
תצורה בסיסית עם wrapper אורכת 2 עד 4 שעות. העברה מ-AsyncStorage ל-MMKV או SQLite אורכת 8 עד 16 שעות. העלות מחושבת באופן אישי. הזמן הגדרת אחסון עבור פרויקט React Native שלך.







