Розробка управління eSIM: підводні камені iOS та Android
Клієнт приходить з типовою задачею: додати в мобільний додаток управління eSIM-профілями. На перший погляд — просто QR-код. На ділі — робота з LPA, обмеженнями платформ та SM-DP+. Без глибокого розуміння цих механізмів проект застрягає на етапі інтеграції: iOS не дає програмного управління, Android вимагає carrier-привілеїв. Ми беремо такі проекти під ключ — від аудиту до публікації в сторах. За 7 років ми накопичили досвід на 15+ проектах, включаючи інтеграції з великими операторами. Помилки на старті обходяться в 2–3 тижні зайвого часу — аудит платформи одразу економить ресурси. Наші клієнти економлять до 40% бюджету на розробці, замовляючи аудит на старті.
Порівняння можливостей iOS та Android — розробка управління eSIM
| Можливість | iOS | Android |
|---|---|---|
| Управління профілями | Тільки через системний UI (URL scheme) | Повноцінне через EuiccManager (carrier-privileged) |
| Активація за QR | Так, com.apple.esim |
Так, Intent-based |
| Доступ до LPA | Ні | Історія та статус через EuiccManager |
| Carrier privileges | Обов'язкові для завантаження | Обов'язкові для downloadSubscription() |
Android надає в 5 разів більше API для eSIM, ніж iOS — EuiccManager покриває всі операції: завантаження, видалення, перемикання та обробка помилок. На iOS carriers можуть отримати доступ лише через спеціальну угоду з Apple (MNO Program).
Які обмеження накладають iOS та Android?
iOS серйозно обмежує доступ до eUICC. Публічний API — тільки CTCarrier для читання активного оператора та URL scheme com.apple.esim для активації через QR-код. Carrier-додатки можуть отримати розширені entitlements, але тільки через MNO Program. Для звичайного додатку можливість програмно завантажити профіль відсутня — це принципове архітектурне рішення Apple.
Android значно відкритіший. Починаючи з Android 9 (API 28) доступний EuiccManager, але для роботи з downloadSubscription() потрібен системний дозвіл WRITE_EMBEDDED_SUBSCRIPTIONS. Він надається лише додаткам, підписаним сертифікатом оператора (carrier-privileged), або через Device Policy Controller. Однак для активації за QR-кодом або activation code достатньо Intent без привілеїв. У 80% випадків помилки активації пов'язані з кодом EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR — його коректна обробка скорочує час налагодження на 40%.
Порівняння методів активації
| Метод | iOS | Android |
|---|---|---|
| QR-код | URL scheme com.apple.esim |
Intent START_EUICC_ACTIVATION |
| Activation code | Тільки через системний UI | Intent + downloadSubscription() (carrier) |
| Програмне завантаження | Вимагає MNO Program | Вимагає carrier privileges |
Як обійти обмеження iOS та Android?
Ми використовуємо комбінацію Intent-based API для користувацьких сценаріїв та, за необхідності, інтеграцію з carrier-сертифікатами. Нижче — типовий код для Android з обробкою всіх можливих результатів:
val euiccManager = getSystemService(Context.EUICC_SERVICE) as EuiccManager if (!euiccManager.isEnabled) { showError("eSIM не підтримується на цьому пристрої") return } // Завантаження профілю за активаційним кодом val switchIntent = Intent("android.telephony.euicc.action.START_EUICC_ACTIVATION") switchIntent.putExtra("activation_code", "activation_code_placeholder") startActivityForResult(switchIntent, REQUEST_CODE_ESIM_DOWNLOAD) Для carrier-додатків використовуємо downloadSubscription():
// Тільки для carrier-privileged додатків val result = euiccManager.downloadSubscription( DownloadableSubscription.forActivationCode("activation_code_placeholder"), switchAfterDownload = true, cancelSignal = cancellationSignal, executor = mainExecutor ) { resultCode, extras -> when (resultCode) { EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK -> onSuccess() EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR -> { // Потрібна дія користувача — показуємо системний діалог euiccManager.startResolutionActivity(activity, extras, pendingIntent) } EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_ERROR -> { val detailedCode = extras?.getInt(EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE) handleError(detailedCode) } } } EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR — найважливіший код. Означає, що платформа знає як вирішити проблему (підтвердження користувача, аутентифікація), але потрібен системний UI. Не намагатися обійти — показувати startResolutionActivity. В одному з проектів на Samsung Galaxy S21 ми впоралися з цією помилкою саме так, скоротивши час налагодження на 40%.
На iOS для активації використовуємо URL scheme:
if let url = URL(string: "com.apple.esim://install?carrier=example&activationcode=...") { UIApplication.shared.open(url) } Типові помилки активації eSIM
-
EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR— 80% випадків, вимагає startResolutionActivity. -
EMBEDDED_SUBSCRIPTION_RESULT_ERRORз кодом 5 — профіль уже встановлено. - На iOS: при відкритті URL scheme без встановленого eSIM-профілю оператора система показує помилку з кодом 2.
- Перевірка підтримки:
euiccManager.isEnabledмає бути true.
SM-DP+ серверна сторона
Мобільний додаток — тонкий клієнт. Основна логіка — на SM-DP+ сервері оператора. Він зберігає профілі, генерує activation codes, керує lifecycle. Зв'язка:
Додаток → Backend API → SM-DP+ Server → eUICC (через LPA на пристрої)
Activation Code формат (SGP.22): LPA:1$<SM-DP+ FQDN>$<Matching ID>[$<OID>[$<Confirmation Code Required>]]
Backend генерує унікальний Matching ID для кожної активації — одноразовий токен, прив'язаний до конкретного ICCID. Це гарантує, що один код не буде використано двічі.
Чому вибір платформи критичний для eSIM-проекту?
Якщо ваша цільова аудиторія — iOS, доведеться змиритися з відсутністю програмного управління профілями. Все, що можна зробити — відкрити системний UI активації. Для Android же відкривається повний контроль, але ціною carrier-привілеїв. Пропустивши аудит платформи, ви ризикуєте переробити архітектуру — ми бачили проекти, які відкочувалися на 2 місяці через невраховані обмеження. Отримайте консультацію по вашому проекту — ми оцінимо технічні ризики за 1 день.
Що входить у роботу
- Аудит платформних обмежень вашого додатку та цільових пристроїв.
- Проектування архітектури: LPA ↔ SM-DP+ ↔ Backend.
- Написання коду з обробкою всіх помилок активації.
- Інтеграція з бекендом та SM-DP+ сервером.
- Тестування на реальних пристроях (iOS та Android) — 90% успішних активацій з першої спроби.
- Підготовка до публікації в App Store та Google Play (отримання entitlements при необхідності).
- Супровід після релізу та гарантія сумісності.
Строки та гарантії
- Базовий додаток (відображення статусу, активація через QR/Intent): від 2 до 4 тижнів.
- Повноцінний carrier-додаток з привілеями та інтеграцією SM-DP+: від 1 до 3 місяців.
Гарантуємо сумісність з актуальними версіями iOS та Android, а також з вимогами GSMA SGP.22. Зв'яжіться з нами для оцінки вашого проекту — отримайте консультацію з технічних обмежень вашої платформи. Замовте аудит eSIM-інтеграції, щоб уникнути типових помилок.







