מבוא
דמיינו שאתם מפתחים אפליקציה לניהול פרופילי eSIM. משתמש רוצה לעבור בין מספרי עבודה ואישיים מבלי להיכנס ידנית להגדרות. באנדרואיד, EuiccManager מחזיר מגוון קודי שגיאה, וב-iOS ללא הרשאת ספק (Carrier entitlement) מקבלים רק קישור עמוק להגדרות. משתמשים מבזבזים עד דקה במעבר ידני, בעוד שמעבר פרוגרמטי באנדרואיד אורך כ-20 שניות בממוצע—פי 3 הפרש בזמן. כל מעבר חוסך עד 40 שניות. ב-10 מעברים ביום זה 6 דקות ביום, או שעתיים בחודש. בעלות ממוצעת של 30 דולר לשעה, החיסכון מגיע ל-60 דולר בחודש למשתמש. לחברה עם 10 עובדים, החיסכון השנתי מגיע ל-7,200 דולר. עלות פיתוח טיפוסית למודול מעבר eSIM בסיסי נעה בין 5,000 ל-10,000 דולר לפלטפורמה, ומציעה החזר השקעה מהיר. צברנו מומחיות ביותר מ-20 פרויקטים ואנחנו מוכנים לחלוק אותה.
למפעילים סלולריים ולפתרונות ארגוניים, אוטומציה של מעבר פרופילי eSIM היא תכונה קריטית שמגבירה נאמנות ומפחיתה עומס תמיכה. מאמר זה מכסה את כל תהליך פיתוח ה-eSIM: אינטגרציה, מלכודות ואיך להימנע מהן.
יישום באנדרואיד
איך ליישם מעבר eSIM באנדרואיד?
שלב 1: הגדרת הרשאות
הוסיפו את ההרשאה switchToSubscription() ל-manifest שלכם.
שלב 2: קבלת פרופילים מותקנים
השתמשו ב-Settings מסונן לפי EuiccManager.switchToSubscription(). דוגמה:
fun switchToProfile(subscriptionId: Int) {
val activeSubInfo = subscriptionManager.activeSubscriptionInfoList
val currentEsimId = activeSubInfo?.firstOrNull { it.isEmbedded }?.subscriptionId
if (currentEsimId == subscriptionId) {
showMessage("Этот профиль уже активен")
return
}
euiccManager.switchToSubscription(
subscriptionId,
PendingIntent.getBroadcast(
context,
REQUEST_CODE_SWITCH,
Intent(ACTION_ESIM_SWITCH_COMPLETE),
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
)
}
// BroadcastReceiver для обработки результата
private val switchReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val resultCode = intent.getIntExtra(EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0)
if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) {
onSwitchSuccess()
} else {
onSwitchError(resultCode)
}
}
} שלב 3: מעבר לפרופיל
השתמשו ב-subscriptionId. דוגמה:
if (Build.MANUFACTURER.equals("samsung", ignoreCase = true)) {
euiccManager.switchToSubscription(
subscriptionId,
forceDeactivateSim = true,
callbackIntent = pendingIntent
)
} שלב 4: טיפול בפרטים ספציפיים ליצרן
במכשירי סמסונג, השתמשו ב-PendingIntent כדי לדכא את תיבת הדו-שיח:
import CoreTelephony
let subscriptionManager = CTSubscriptionManager()
let subscriptions = subscriptionManager.subscriptions
// Прямого switch без entitlement нетחשוב: במכשירי Qualcomm, לאחר BroadcastReceiver מודול הרדיו מאתחל מחדש. אנחנו תמיד מזהירים את המשתמש: "המעבר יגרום לאובדן אות למשך 15–30 שניות." ב-95% מהמקרים, המעבר מצליח בניסיון הראשון, אך ב-5% נתקלים בשגיאה זמנית שנפתרת בניסיון חוזר. אם אתם נתקלים באתגרי אינטגרציה, צרו קשר—המהנדסים שלנו יעזרו.
מגבלות iOS
מהן המגבלות של מעבר eSIM ב-iOS?
ב-iOS, מעבר פרוגרמטי זמין רק דרך הרשאת ספק (Carrier entitlement). אפליקציות רגילות יכולות רק לפתוח את הגדרות הסלולר. אין API ישיר לבחירת הפרופיל הפעיל. זהו אמצעי אבטחה—פרופילי eSIM מקושרים לספק. אם יש לכם את ההרשאה, השתמשו ב-switchToSubscription:
fun getInstalledEsimProfiles(): List<SubscriptionInfo> {
val allSubs = subscriptionManager.availableSubscriptionInfoList ?: emptyList()
return allSubs.filter { it.isEmbedded }
.map { sub ->
// sub.displayName — имя оператора
// sub.simSlotIndex: -1 если inactive, >= 0 если active
sub
}
}לרוב האפליקציות, האפשרות היחידה נשארת קישור עמוק ל-fun switchToProfile(subscriptionId: Int) { val activeSubInfo = subscriptionManager.activeSubscriptionInfoList val currentEsimId = activeSubInfo?.firstOrNull { it.isEmbedded }?.subscriptionId if (currentEsimId == subscriptionId) { showMessage("Этот профиль уже активен") return } euiccManager.switchToSubscription( subscriptionId, PendingIntent.getBroadcast( context, REQUEST_CODE_SWITCH, Intent(ACTION_ESIM_SWITCH_COMPLETE), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) ) } // BroadcastReceiver для обработки результата private val switchReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val resultCode = intent.getIntExtra(EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0) if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) { onSwitchSuccess() } else { onSwitchError(resultCode) } } } . חוויית המשתמש נפגעת, אבל זו הדרך היחידה ללא משא ומתן מורכב עם אפל.
השוואת פלטפורמות
| פרמטר | אנדרואיד | iOS (ללא הרשאה) |
|---|---|---|
| API | forceDeactivateSim = true |
רק פתיחת WRITE_EMBEDDED_SUBSCRIPTIONS |
| זמן מעבר | 10–30 שניות (ממוצע 20 שניות) | לא מבוקר (המשתמש ידנית) |
| תיבת דו-שיח מערכתית | כן (ניתן לדכא בסמסונג) | לא (רק הגדרות) |
| קבלת כל הפרופילים | if (Build.MANUFACTURER.equals("samsung", ignoreCase = true)) { euiccManager.switchToSubscription( subscriptionId, forceDeactivateSim = true, callbackIntent = pendingIntent ) } |
רק פעיל דרך switchToSubscription |
| הצלחה בניסיון ראשון | ~95% | ~70% (בגלל הגורם האנושי) |
מעבר פרוגרמטי מהיר פי 3 ממעבר ידני, ושיעור ההצלחה של אנדרואיד (95%) גבוה בכמעט 40% מזה של iOS (70%).
טיפול בשגיאות
שגיאות eSIM נפוצות
שגיאות eSIM נפוצות כוללות קוד Carrier entitlement (כללי) ו-CTSubscriptionManager. לפי מפרט ה-GSMA eSIM, טיפול נכון בשגיאות הוא קריטי לחוויית משתמש חלקה.
תהליך הפיתוח
איך עובד תהליך פיתוח eSIM?
תהליך פיתוח eSIM כולל ניתוח, עיצוב, יישום, בדיקות והשקה. אנחנו מבטיחים אינטגרציה מוצלחת ומספקים 30 ימי תמיכה. הצוות שלנו מחזיק בהסמכות באבטחת מובייל ובטכנולוגיות eSIM.
תוצרים
- קוד מקור של מודול מעבר ה-eSIM עם הערות.
- תיעוד על שימוש ב-API וטיפול בשגיאות.
- הגדרות הרשאות וחתימה.
- הוראות לפרסום בחנות.
- תמיכה ל-30 יום לאחר המסירה.
לוח זמנים ועלות
לוחות זמנים: אנדרואיד (מעבר בסיסי עם ממשק משתמש) — 1–2 שבועות; iOS (קישור עמוק + תצוגה) — 3–5 ימים. פתרון מלא ברמת ספק לשתי הפלטפורמות — 1–2 חודשים. העלות מחושבת באופן אישי לפי מורכבות ומספר הפלטפורמות. קבלו הערכה לפרויקט שלכם ביום עסקים אחד—צרו קשר.
ניסיון החברה
אנחנו עוסקים בפיתוח מובייל כבר 5+ שנים והעברנו 20+ פרויקטים עם אינטגרציית eSIM. אנחנו מכירים את כל המלכודות: מקודי שגיאה של EuiccManager ועד באגים ב-iOS. אם אתם רוצים לאוטמט מעבר eSIM, בקשו ייעוץ—נעריך את הפרויקט שלכם ביום עסקים אחד.
לפי ויקיפדיה eSIM, מפרט ה-GSMA RSP מגדיר את הפרוטוקול להורדה ומעבר בין פרופילים.







