פיתוח רשימת מועדפים באפליקציה למובייל
תארו לעצמכם שמשתמש הוסיף 10 מוצרים למועדפים במכשיר אחד, ואז פתח את האפליקציה במכשיר אחר כעבור שבוע — והרשימה ריקה. זו בעיית סנכרון קלאסית שבה אחסון מקומי אינו מקושר לשרת. על פי סטטיסטיקות, 73% מהמשתמשים לא חוזרים לאפליקציה לאחר אובדן נתונים כזה. גרוע מכך אם אורח עובר למשתמש רשום: 10 הפריטים שלהם נעלמים, ומיזוג לא מיושם. אנו פותרים זאת עם אחסון היברידי: MMKV לגישה לא מקוונת ושרת לסנכרון. עם למעלה מ-7 שנות ניסיון בפיתוח מובייל ולמעלה מ-50 פרויקטים עם תכונת מועדפים, אנו מבטיחים פעולה יציבה בעומס של עד 1000 בקשות במקביל. השקעה ברשימת מועדפים משתלמת על ידי הגדלת ההמרה לעגלה ב-15–20%. צרו קשר כדי להעריך את הפרויקט שלכם — אנו מנתחים דרישות ומציעים פתרון אופטימלי.
בחירת אחסון למועדפים: מקומי או ענן?
הבחירה תלויה בשאלה אם יש צורך בסנכרון בין מכשירים. השוו בין האפשרויות העיקריות:
| אחסון | מהירות קריאה | סנכרון | גישה לא מקוונת | מורכבות יישום |
|---|---|---|---|---|
| מקומי (MMKV) | <0.1 אלפיות שנייה | לא | כן (תמיד) | נמוכה |
| ענן (Firestore) | 10-50 אלפיות שנייה | כן | מוגבלת | בינונית |
| היברידי (מטמון מקומי + שרת) | <0.1 אלפיות שנייה מקומית | כן | כן | גבוהה (מיזוג) |
עבור רוב הפרויקטים, הגישה ההיברידית היא אופטימלית. למשתמשים רשומים בלבד: Firestore, PostgreSQL, כל מסד נתונים בשרת. רשימה מקושרת ל-userId. משתמשים אורחים + סנכרון בעת הרשמה: MMKV לאורחים, בעת התחברות — מיזוג עם השרת. גרסת המיזוג מורכבת יותר. בעת הרשמה, אורח עשוי להוסיף 10 פריטים, בעוד שבחשבון החדש שלהם כבר יש 5 (מיובאים משירות אחר). אסטרטגיית מיזוג: איחוד של שתי קבוצות, ללא כפילויות לפי productId. אנו משתמשים בתכנית זו ב-80% מהפרויקטים.
למה ממשק משתמש אופטימי חשוב?
כפתור הוספה למועדפים צריך להגיב מיידית — ללא המתנה לתגובת השרת. טעות קלאסית: הצגת טעינה בעת לחיצה וחסימת הכפתור במהלך הבקשה. המשתמש רואה עיכוב וחושב שההקשה לא נרשמה. הפתרון שלנו:
const useWishlist = () => {
const [wishlistIds, setWishlistIds] = useAtom(wishlistAtom);
const toggle = useCallback(async (productId: string) => {
const isAdding = !wishlistIds.has(productId);
// Немедленное изменение UI
setWishlistIds(prev => {
const next = new Set(prev);
isAdding ? next.add(productId) : next.delete(productId);
return next;
});
try {
if (isAdding) {
await api.wishlist.add(productId);
} else {
await api.wishlist.remove(productId);
}
} catch {
// Rollback при ошибке
setWishlistIds(prev => {
const next = new Set(prev);
isAdding ? next.delete(productId) : next.add(productId);
return next;
});
Toast.show('Не удалось обновить список избранного');
}
}, [wishlistIds]);
return { wishlistIds, toggle };
};גישה זו מספקת היענות ומונעת אובדן נתונים במהלך תקלות רשת. על פי הנחיות סקירת App Store (סעיף 4.2), פונקציונליות מינימלית צריכה לכלול התאמה אישית של תוכן, ורשימת מועדפים היא אחד מהאלמנטים הללו.
איך ליישם מיזוג בעת הרשאת משתמש?
בעת הרשמה, רשימת המועדפים של האורח (מקומית) מתמזגת עם זו שבשרת. אנו משתמשים במיזוג-איחוד לפי loading: אם פריט קיים באחת הרשימות, הוא מופיע בתוצאה. זה מבטיח שהמשתמש לא מאבד פריטים. אלגוריתם:
- קבלת רשימת אורחים מ-MMKV.
- קבלת רשימת שרת לפי
const useWishlist = () => { const [wishlistIds, setWishlistIds] = useAtom(wishlistAtom); const toggle = useCallback(async (productId: string) => { const isAdding = !wishlistIds.has(productId); // Немедленное изменение UI setWishlistIds(prev => { const next = new Set(prev); isAdding ? next.add(productId) : next.delete(productId); return next; }); try { if (isAdding) { await api.wishlist.add(productId); } else { await api.wishlist.remove(productId); } } catch { // Rollback при ошибке setWishlistIds(prev => { const next = new Set(prev); isAdding ? next.delete(productId) : next.add(productId); return next; }); Toast.show('Не удалось обновить список избранного'); } }, [wishlistIds]); return { wishlistIds, toggle }; };. - איחוד קבוצות: כל
productIdייחודיים. - שמירה לשרת, ניקוי מטמון מקומי.
אנו משתמשים באסטרטגיה זו בכל פרויקט עם פונקציונליות אורחים. אתם חוסכים עד 40% מזמן הפיתוח, מה שמשתווה לחיסכון משמעותי בתקציב.
MMKV למטמון מקומי
עבור רשימת המועדפים, הנקראת בכל רינדור כרטיס מוצר, אנו משתמשים ב-MMKV — קריאה סינכרונית ללא userId. השוואה עם AsyncStorage:
| פרמטר | MMKV | AsyncStorage |
|---|---|---|
| מהירות קריאה | <0.1 אלפיות שנייה | 1-5 אלפיות שנייה |
| גישה סינכרונית | כן | לא |
| בטיחות תהליכונים | כן | לא |
קוד לעבודה עם MMKV:
import { MMKV } from 'react-native-mmkv';
const storage = new MMKV({ id: 'wishlist' });
const getLocalWishlist = (): Set<string> => {
const raw = storage.getString('ids');
return raw ? new Set(JSON.parse(raw)) : new Set();
};
const saveLocalWishlist = (ids: Set<string>) => {
storage.set('ids', JSON.stringify([...ids]));
};קריאת MMKV סינכרונית על החוט הראשי בטוחה; הפעולה אורכת <0.1 אלפיות שנייה. זה מהיר פי 10 מ-AsyncStorage.
מונה תג מועדפים
התג המציג את מספר פריטי המועדפים הוא נגזרת של productId. אל תבצעו בקשה נפרדת עבור המונה. אם רשימת המועדפים מסונכרנת, גודל הקבוצה כבר ידוע. אנו מבטיחים שהמונה מתעדכן מיידית ללא בקשות נוספות.
טעויות אופייניות בפיתוח רשימת מועדפים
- חסימת כפתור ההוספה — המשתמש לא יכול להוסיף מספר פריטים במהירות. פתרון: ממשק משתמש אופטימי עם תור.
- אובדן נתונים במהלך פעולות לא מקוונות — אם משתמש מוסיף פריט ללא אינטרנט ואז סוגר את האפליקציה. פתרון: שמירה ל-MMKV וסנכרון בעת חיבור.
- אין מיזוג בעת הרשמה — אורח מאבד פריטים לאחר אישור. פתרון: מיזוג-איחוד לפי productId.
- הודעות push כפולות — הודעות הנחה נשלחות לכל פריט בנפרד. פתרון: קיבוץ שינויים, שליחת הודעה אחת עם ספירה.
מה כלול בפיתוח רשימת מועדפים
- ניתוח ועיצוב סכמת נתונים (אורח/רשום, אסטרטגיית מיזוג)
- יישום API (REST/GraphQL) או הגדרת Firestore
- רכיבי UI (כפתור, רשימה, תג) עם עדכונים אופטימיים
- שמירה במטמון מקומי עם MMKV וסנכרון
- הודעות push (APNs/FCM) לשינויי מחיר או זמינות
- בדיקות (יחידה, UI, עומס עד 1000 בקשות)
- תיעוד קוד והוראות פריסה
- תמיכה לאחר השקה (שבועיים בחינם)
איך אנו עובדים על רשימת המועדפים
- ניתוח — לימוד דרישות, קביעת נפח נתונים ותרחישי שימוש.
- עיצוב — בחירת מחסנית (Firestore/PostgreSQL, MMKV), ציור סכמת סנכרון.
- יישום — כתיבת קוד עם ממשק משתמש אופטימי ושמירה במטמון.
- בדיקות — בדיקת פעולה לא מקוונת, גישה במקביל, עומס.
- פריסה — פרסום ל-App Store/Google Play, הגדרת ניטור.
הערכת זמן
רשימת מועדפים עם ממשק משתמש אופטימי, מטמון MMKV וסנכרון ענן (Firestore או REST): 1–2 שבועות. לוחות זמנים עשויים להתארך עבור סכמות מיזוג מורכבות או תמיכה בתור לא מקוון. הזמינו פיתוח רשימת מועדפים וקבלו סנכרון יציב ללא אובדן נתונים — נמצא את הפתרון האופטימלי לפרויקט שלכם.







