Интеграция MobileIron для управления мобильным приложением
MobileIron — EMM-платформа, с 2020 года входящая в состав Ivanti под названием Ivanti Mobile@Work и Ivanti Neurons for MDM. Встречается в enterprise-организациях с длинной историей MDM-развёртывания: банки, государственные структуры, крупный retail. Если заказчик уже использует MobileIron/Ivanti — интеграция приложения строится на MobileIron AppConnect SDK или через стандартный Managed App Configuration протокол Apple/Android Enterprise.
Два пути интеграции: AppConnect SDK vs Managed Config
Путь 1: MobileIron AppConnect SDK. Проприетарный SDK, который создаёт изолированный контейнер вокруг приложения. Данные приложения шифруются независимым ключом, управляемым MobileIron сервером. Контейнер открывается только при наличии активной MobileIron-регистрации.
Путь 2: Managed App Configuration (Apple) / Android Managed Configurations. Стандартный механизм без проприетарного SDK. MobileIron как MDM-сервер поддерживает оба протокола. Приложение не зависит от вендора EMM — работает и с Intune, и с Workspace ONE, и с MobileIron.
Для новых проектов предпочитаем Managed App Configuration — меньше vendor lock-in. AppConnect SDK оправдан, если нужны специфические функции: AppConnect Tunnel (per-app VPN), шифрование AppConnect Keychain, или инфраструктура уже на MobileIron и переход не планируется.
AppConnect SDK: интеграция на iOS
Добавление через CocoaPods:
pod 'AppConnectLib'
Инициализация:
import AppConnectLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, ACManagerDelegate {
func application(_ app: UIApplication, didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
ACManager.shared().delegate = self
ACManager.shared().startUp(with: self.window)
return true
}
// Получаем конфигурацию от MobileIron сервера
func appConnectConfigReceived(_ config: [AnyHashable: Any]?) {
guard let config = config else { return }
let serverURL = config["server_url"] as? String
let orgID = config["org_id"] as? String
AppSettings.shared.configure(serverURL: serverURL, orgID: orgID)
}
// Политика DLP изменилась
func appConnectPolicyReceived(_ policy: [AnyHashable: Any]?) {
let copyPasteAllowed = policy?["copy_paste_out"] as? Bool ?? false
DLPEnforcer.shared.setCopyPasteEnabled(copyPasteAllowed)
}
}
AppConnect Keychain: изолированное хранилище секретов
AppConnect предоставляет собственный Keychain, зашифрованный ключом MobileIron-контейнера. Если MDM-регистрация отзывается — ключи недоступны без повторной авторизации.
// Сохранение через AppConnect Keychain
let acKeychain = ACKeychain()
acKeychain.setData(tokenData, forKey: "auth_token", inGroup: "corporate")
// Чтение
let tokenData = acKeychain.data(forKey: "auth_token", inGroup: "corporate")
Отличие от стандартного iOS Keychain: при remote wipe через MobileIron AppConnect Keychain очищается независимо от системного Keychain. Личные ключи пользователя не затрагиваются.
Android: MobileIron Android AppConnect
На Android AppConnect работает аналогично, но реализован через AppConnect wrapper вокруг Application:
class MyApplication : AppConnectApplication() {
override fun onCreate() {
super.onCreate()
// AppConnect перехватывает ContentProvider, ClipboardManager, FileProvider
}
}
Важно: AppConnectApplication требует, чтобы все Activity наследовались от AppConnectActivity. Это серьёзное ограничение для legacy-приложений на Fragment + ViewPager архитектуре. Частичный выход — AppConnectFragmentActivity как промежуточный базовый класс.
Ivanti Neurons for MDM: современный API
После ребрендинга в Ivanti появился новый cloud-native MDM с REST API для управления: GET /api/v1/devices, POST /api/v1/policies, DELETE /api/v1/apps/{appId}. Это позволяет автоматизировать управление приложением из CI/CD без ручных действий в UI консоли.
Пример: автоматический push нового IPA при релизе через GitHub Actions:
# Ivanti Neurons REST API
curl -X POST "https://tenant.mobileiron.com/api/v1/apps" \
-H "Authorization: Bearer $IVANTI_TOKEN" \
-H "Content-Type: multipart/form-data" \
-F "file=@build/app.ipa" \
-F "metadata={\"bundleId\":\"com.company.app\",\"appStoreId\":\"enterprise\"}"
Типичные проблемы при интеграции
AppConnect не инициализируется при первом запуске. Причина: MobileIron Go (клиентское приложение) не установлено или не залогинено. AppConnect SDK требует MobileIron Go как «сторожа контейнера». В production enrollment workflow — MobileIron Go устанавливается первым через MDM.
Конфигурация не приходит после смены политики на сервере. AppConnect polling interval по умолчанию — 15 минут. Для force-sync: ACManager.shared().checkIn(). В production добавляем checkin при каждом applicationWillEnterForeground.
Этапы интеграции
Анализ инфраструктуры MobileIron/Ivanti → выбор AppConnect SDK или Managed App Configuration → интеграция SDK → реализация config/policy callbacks → AppConnect Keychain → тестирование enrollment и wipe → деплой через MobileIron App Catalog.
Сроки: Managed App Configuration (без SDK) — 2–3 недели. Полная интеграция AppConnect SDK — 4–7 недель. Стоимость рассчитывается индивидуально.







