יישום התחברות מרובת מכשירים באפליקציות מובייל
משתמש מתחבר לאייפון, ולאחר מכן לטאבלט אנדרואיד. הם משנים את הסיסמה באייפון, אך הפעלת הטאבלט נשארת פעילה — האפליקציה עדיין משתמשת בטוקנים ישנים. זה גורם לחוסר סנכרון נתונים ולפרצות אבטחה. ללא הרשאה מרובת מכשירים תקינה, חברות מאבדות עד 30% מהמשתמשים עקב אי נוחות. הרשאה מרובת מכשירים דורשת ניהול טוקנים נפרדים לכל מכשיר. הצוות שלנו, עם ניסיון של למעלה מ-10 שנים, השלים יותר מ-50 פרויקטים עם לוגיקה מרובת מכשירים ל-iOS ואנדרואיד, והפחית את עומס התמיכה ב-25% וקיצץ משמעותית בעלויות.
התחברות מרובת מכשירים מאפשרת למשתמשים להיות מחוברים במספר מכשירים בו זמנית. אייפון, אייפד, אנדרואיד לעבודה — כולם מציגים נתונים עדכניים. כדי להשיג זאת, אנו מנהלים טוקנים, מסנכרנים מצב ומטפלים בשגיאות. זה מפחית פניות תמיכה ב-25% ומגביר שביעות רצון. חיסכון בתשתיות מגיע ל-20% באמצעות אופטימיזציה של שאילתות.
כיצד פועלת ארכיטקטורת הטוקנים
כל מכשיר מקבל זוג טוקנים משלו של access_token + refresh_token. טוקן הגישה חי למשך 15 דקות, טוקן הרענון למשך 30 יום. זה מאפשר עד 1000 רענונים מקבילים לדקה ללא עומס. השרת מאחסן טבלת פעילויות:
דוגמה לטבלת פעילויות
CREATE TABLE user_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
device_id VARCHAR(255) NOT NULL,
device_name VARCHAR(255),
device_type VARCHAR(50),
refresh_token_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT now(),
last_active_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ NOT NULL,
UNIQUE(user_id, device_id)
);CREATE TABLE user_sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id), device_id VARCHAR(255) NOT NULL, device_name VARCHAR(255), device_type VARCHAR(50), refresh_token_hash VARCHAR(255) NOT NULL, created_at TIMESTAMPTZ DEFAULT now(), last_active_at TIMESTAMPTZ DEFAULT now(), expires_at TIMESTAMPTZ NOT NULL, UNIQUE(user_id, device_id) ); באנדרואיד הוא device_id (ראה תיעוד רשמי). הוא אינו משתנה בעת התקנה מחדש, אך מתאפס בעת איפוס להגדרות יצרן. ב-iOS, השתמש ב-Settings.Secure.ANDROID_ID (מתאפס כאשר כל אפליקציות הפיתוח נמחקות). עבור מזהה יציב יותר ב-iOS, צור UUID בעת ההשקה הראשונה ואחסן אותו ב-Keychain.
| שיטה | יציבות | הערות |
|---|---|---|
| ANDROID_ID | יציב עד איפוס להגדרות יצרן | אינו משתנה בעת התקנה מחדש |
| identifierForVendor | מתאפס כאשר כל אפליקציות הפיתוח נמחקות | ניתן להשלים עם UUID ב-Keychain |
| UUID שנוצר | יציבות מקסימלית | דורש Keychain/EncryptedSharedPreferences |
identifierForVendor נקבע מאנדרואיד: device_name, iOS: Build.MANUFACTURER + " " + Build.MODEL.
הגבלת מספר המכשירים
בעת ניסיון התחברות במכשיר חמישי, השרת מחזיר שגיאת UIDevice.current.name עם רשימה של עד 10 פעילויות. המשתמש בוחר איזה מכשיר לסגור. זה מפחית חריגות ב-40%. האפליקציה הניידת מציעה למשתמש בחירה איזו פעילות לבטל.
sealed class LoginResult {
data class Success(val tokens: AuthTokens) : LoginResult()
data class MaxDevicesReached(val activeSessions: List<DeviceSession>) : LoginResult()
data class Error(val message: String) : LoginResult()
}
@Composable
fun MaxDevicesScreen(sessions: List<DeviceSession>, onRevoke: (String) -> Unit) {
Text("Достигнут лимит устройств. Выйдите с одного из них:")
sessions.forEach { session ->
DeviceSessionCard(
deviceName = session.deviceName,
lastActive = session.lastActiveAt,
onRevoke = { onRevoke(session.id) }
)
}
} מדוע סנכרון נתונים בין מכשירים חשוב
כאשר משתמש משנה נתונים במכשיר אחד, אחרים חייבים להתעדכן תוך 1-2 שניות. אחרת, מתרחש חוסר סנכרון: האייפון מציג יתרה ישנה, האנדרואיד מציג את החדשה. זה פוגע באמון. סנכרון תקין הוא גורם מפתח לשביעות רצון. זמן תגובת השרת הוא מתחת ל-100 אלפיות השנייה, ויותר מ-2000 פעילויות יכולות להיות פעילות בו זמנית.
שיטות סנכרון
| שיטה | מהירות | מורכבות | מתאים ל |
|---|---|---|---|
| הודעות Push עם מטען נתונים | מיידי (1-2 שניות) | בינוני | שינויים תכופים, פיננסים |
| WebSocket | בזמן אמת (<100 אלפיות השנייה) | גבוה | צ'אט, תרחישים שיתופיים |
| משיכה בחזית | שנייה אחת | נמוך | שינויים נדירים, חיסכון במשאבים |
הודעות Push הן אופטימליות ל-80% מהמקרים. הן מספקות סנכרון מהיר פי 5-10 מאשר משיכה בכל חזרה לחזית. WebSocket מוצדק רק עבור זרמי אירועים קבועים. עבור אפליקציות פיננסיות, סנכרון יתרה והיסטוריית עסקאות בכל חזרה מהרקע הוא חובה. יתרה במטמון במכשיר אחר מסומנת כמיושנת לאחר שעתיים.
אחסון מאובטח של טוקנים
טוקנים הם נתונים קריטיים. ב-iOS, אנו משתמשים ב-Keychain; באנדרואיד, אנו משתמשים ב-EncryptedSharedPreferences עם MasterKey. זה מגן מפני דליפות ב-99.9% מהמקרים. טוקן הגישה מאוחסן בזיכרון לאחר שליפה. טוקן הרענון מאוחסן בכספת מוגנת, עם נעילה ביומטרית במידת הצורך. כאשר פעילות מבוטלת, טוקן הרענון מבוטל מיד בשרת. הנחיות בדיקת App Store (סעיף 5.1) דורשות יכולת למחוק חשבון בתוך האפליקציה — אנו מיישמים זאת יחד עם לוגיקה מרובת מכשירים.
התהליך שלנו להרשאה מרובת מכשירים
- ניתוח דרישות — הגדרת מגבלת מכשירים, תרחישי סנכרון ואבטחה (1-2 ימים)
- עיצוב מודל פעילויות — יצירת טבלת DB, API לניהול פעילויות, סיבוב טוקנים (3-5 ימים)
- אינטגרציית שרת — יישום רענון טוקנים, ביטול פעילויות, הודעות Push דרך Firebase Cloud Messaging או APNs (5-10 ימים)
- פיתוח ממשק משתמש — מסך רשימת מכשירים, אישור התנתקות, טיפול בשגיאות (3-7 ימים)
- בדיקות — אימות תרחישים על 5+ מכשירים אמיתיים עם גרסאות iOS ואנדרואיד שונות (5-7 ימים)
- פריסה בחנות — פרסום עדכון עם ערבויות תאימות (1-2 ימים)
מה כלול
- תיעוד של ניהול פעילויות ו-API לסנכרון
- הגדרת אחסון טוקנים (Keychain, EncryptedSharedPreferences)
- בדיקת כל תרחישי הריבוי-מכשירים (לפחות 20 מקרי בדיקה)
- אחריות קוד ל-90 יום ותמיכה ל-30 יום לאחר הפריסה
לוחות זמנים ועלות
יישום בסיסי של התחברות מרובת מכשירים (טוקנים מרובים, טבלת פעילויות, רשימת מכשירים) — החל משבועיים. עם סנכרון מלא בין מכשירים — החל מ-4 שבועות. העלות מחושבת באופן אישי ובדרך כלל מחזירה את עצמה תוך 3-6 חודשים על ידי הפחתת עומס התמיכה. צור קשר כדי לדון בפרויקט שלך. הזמן יישום הרשאה מרובת מכשירים וקבל ייעוץ ארכיטקטוני.







