כפתור "מחיקת חשבון" הוא אחת הדרישות הכי פחות מוערכות. 70% מהאפליקציות משאירות נתונים במערכת לאחר לחיצה על הכפתור: במאגרי נתונים, בלוגים, ב-SDK של צד שלישי. App Store ו-Google Play דורשים מכל האפליקציות עם חשבונות לספק אפשרות מחיקה מלאה ישירות מהאפליקציה, לא דרך טופס אינטרנט. GDPR ו-CCPA מעניקים למשתמשים את הזכות למחיקה זו. יישום מלא דורש התחשבות בניואנסים רבים: מחיקה מדורגת, תקופת חסד, ניקוי מכשירים וניקוי משירותי צד שלישי. אנו מבטיחים עמידה מלאה בדרישות הרגולטוריות.
כיצד ליישם מחיקת נתונים מדורגת?
מבחינה טכנית, "מחיקת חשבון" אינה פקודת SQL אחת. זהו תהליך מדורג שאם מיושם בצורה לא נכונה, או מוחק לא הכל או מוחק מה שלא צריך להימחק. הנתונים מתחלקים לשלוש קטגוריות:
| קטגוריה | דוגמאות | פעולה |
|---|---|---|
| מחיקה מיידית | פרופיל, היסטוריית פעולות, טוקנים, נתוני אנליטיקה | מחיקה מלאה |
| אנונימיזציה | תגובות, דירוגים, מדדים מצטברים | החלפת מזהה ב-"משתמש שנמחק" |
| שמירה | עסקאות פיננסיות, נתונים תחת צו משפטי | שמירה למשך 5–7 שנים כנדרש בחוק |
ליישום אמין, אנו משתמשים בארכיטקטורה אסינכרונית: בקשה → תור → ביצוע → אישור. להלן דוגמה ב-Kotlin עם coroutines:
class AccountDeletionService(
private val deletionQueue: DeletionQueue,
private val notificationService: NotificationService
) {
suspend fun requestDeletion(userId: String, reason: DeletionReason?) {
// 1. Немедленно блокируем аккаунт — никаких новых данных
userRepository.setStatus(userId, UserStatus.PENDING_DELETION)
// 2. Отзываем все активные токены
authTokenRepository.revokeAll(userId)
// 3. Ставим в очередь удаление по сервисам
deletionQueue.enqueue(
DeletionJob(
userId = userId,
requestedAt = System.currentTimeMillis(),
scheduledFor = System.currentTimeMillis() + GRACE_PERIOD_MS, // 30 дней
steps = listOf(
DeletionStep.PROFILE_DATA,
DeletionStep.ANALYTICS_EVENTS,
DeletionStep.THIRD_PARTY_SDKS,
DeletionStep.BACKUP_ANONYMIZATION,
DeletionStep.AUDIT_LOGS_RETENTION
)
)
)
// 4. Уведомляем пользователя
notificationService.sendDeletionConfirmation(userId)
}
}חשוב: כל SDK שקיבל נתוני משתמש חייב למחוק אותם. Firebase Analytics, לדוגמה, אין לו API ישיר למחיקת נתונים של משתמש ספציפי — רק דרך class AccountDeletionService( private val deletionQueue: DeletionQueue, private val notificationService: NotificationService ) { suspend fun requestDeletion(userId: String, reason: DeletionReason?) { // 1. Немедленно блокируем аккаунт — никаких новых данных userRepository.setStatus(userId, UserStatus.PENDING_DELETION) // 2. Отзываем все активные токены authTokenRepository.revokeAll(userId) // 3. Ставим в очередь удаление по сервисам deletionQueue.enqueue( DeletionJob( userId = userId, requestedAt = System.currentTimeMillis(), scheduledFor = System.currentTimeMillis() + GRACE_PERIOD_MS, // 30 дней steps = listOf( DeletionStep.PROFILE_DATA, DeletionStep.ANALYTICS_EVENTS, DeletionStep.THIRD_PARTY_SDKS, DeletionStep.BACKUP_ANONYMIZATION, DeletionStep.AUDIT_LOGS_RETENTION ) ) ) // 4. Уведомляем пользователя notificationService.sendDeletionConfirmation(userId) } } במכשיר ובקשה דרך Firebase Console. יש להתחשב במגבלה זו במהלך הערכת GDPR של Firebase כעיבוד משנה.
מדוע יש צורך בתקופת חסד של 30 יום?
תקופת החסד (30 יום) נותנת למשתמשים הזדמנות לשחזר את חשבונם אם הם משנים את דעתם. במהלך תקופה זו, הנתונים מוקפאים אך לא נמחקים. לאחר התפוגה, מתרחשת מחיקה אוטומטית. גישה זו מפחיתה תלונות משתמשים פי 2 (לפי הסטטיסטיקה שלנו) ועומדת במלואה בהמלצות GDPR.
לקוח נייד: מה קורה במכשיר
לאחר אישור המחיקה, אנו מנקים מיד נתונים מקומיים מבלי לחכות לתקופת החסד בצד השרת:
func performLocalDeletion() {
// Keychain
let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword]
SecItemDelete(query as CFDictionary)
// UserDefaults
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
// Core Data / SQLite
try? FileManager.default.removeItem(at: coreDataURL)
try? FileManager.default.removeItem(at: sqliteURL)
// Кеши
URLCache.shared.removeAllCachedResponses()
// Выходим на экран логина
coordinator.navigateToLanding()
}לאחר מחיקה מקומית, האפליקציה מתנהגת כאילו הותקנה לאחרונה. נתוני השרת יימחקו לפי לוח הזמנים.
אימות לפני מחיקה
עלינו למנוע מתוקף למחוק חשבון של משתמש אחר. אנו מיישמים:
- אימות מחדש (סיסמה או ביומטריה)
- אישור כוונה (לא חלון קופץ עם שני כפתורים בגודל שווה)
- אימייל עם קוד אימות לחשבונות רגישים
מה כלול בעבודה
אנו מספקים חבילה מלאה: תיעוד על תהליך המחיקה, הוראות לתמיכה, אינטגרציה עם SDK של צד שלישי ובדיקות עמידה ב-GDPR. אתה מקבל:
- קוד מקור עם הערות ברוסית
- דיאגרמת מחיקה ארכיטקטונית
- דוח עמידה בהנחיות App Store Review (סעיף 4.2/5.1)
- הדרכה לצוות התמיכה על תרחישים אופייניים
פרטים על שלבי היישום
תהליך
- אנליטיקה — ביקורת על ארכיטקטורת הנתונים הנוכחית והרכב SDK של צד שלישי.
- עיצוב — בחירת אסטרטגיה: מחיקה סינכרונית לעומת אסינכרונית, תקופת חסד, קטגוריזציה של נתונים.
- יישום — פריסת ממשק מחיקת חשבון, תור שרת, ניקוי מקומי, אינטגרציה עם APIs של שירותי צד שלישי.
- בדיקות — אימות כל התרחישים: מחיקה, שחזור, מחיקה חלקית.
- פריסה — פרסום העדכון ל-App Store / Google Play, ניטור לאחר השחרור.
השוואת גישות
| גישה | יתרונות | חסרונות |
|---|---|---|
| מחיקה סינכרונית | פשטות היישום | זמני המתנה ארוכים עם נפחי נתונים גדולים |
| אסינכרונית עם תור | לא חוסמת את המשתמש, כשלים חלקים | קשה יותר לניפוי באגים |
| תקופת חסד | שחזור חשבון, פחות תלונות | 30 ימי אחסון נוספים |
מחיקה אסינכרונית עם תקופת חסד עדיפה על פני סינכרונית: היא מפחיתה את עומס השרת פי 3 ומכסה במלואה את דרישות GDPR.
לוח זמנים ועלות
יישום בסיסי (ממשק משתמש + מחיקה מקומית + תור שרת) לוקח 1–2 ימים. עם מחיקה מכל עיבודי המשנה ותהליך מתועד — 2–3 ימים. העלות מחושבת באופן אישי לפי מורכבות האינטגרציות ומספר SDK של צד שלישי.
אנחנו צוות עם ניסיון של למעלה מ-10 שנים בפיתוח אפליקציות מובייל. השלמנו בהצלחה 40+ פרויקטים שעברו את המודרציה של App Store ו-Google Play עם דרישות פרטיות. אנו מבטיחים שהאפליקציה שלך תעמוד בדרישות הרגולטוריות העדכניות.
הזמן עכשיו ביקורת עמידה ב-GDPR לאפליקציה שלך. צור קשר לייעוץ — נעריך את הפרויקט שלך.







