Реализация Remote Wipe корпоративных данных в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация Remote Wipe корпоративных данных в мобильном приложении
Сложная
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация Remote Wipe корпоративных данных в мобильном приложении

Сотрудник потерял телефон. В приложении — корпоративная переписка, документы, токены сессий. ИТ-отдел хочет нажать одну кнопку в консоли и удалить всё корпоративное, не трогая личные фотографии. На это есть 15 минут до того, как телефон окажется в чужих руках.

Что именно нужно удалить и как быстро

Remote Wipe — это не одна операция, а каскад. Сначала нужно понять, что считается «корпоративными данными»:

  • SQLite базы и Shared Preferences с токенами и кешем
  • Файлы во внутреннем хранилище (filesDir, cacheDir)
  • Данные в Keychain / Android Keystore — сертификаты, ключи шифрования
  • Push-токены FCM/APNs, привязанные к пользователю
  • Локальные копии документов в external storage (если есть)
  • Активные сессии — их нужно инвалидировать на сервере

Удалить файлы с диска без серверной команды нельзя — устройство может быть offline. Значит, нужна очередь команд с гарантированной доставкой.

Архитектура надёжного Remote Wipe

Самый частый антипаттерн — реализовать wipe через обычный push-токен FCM. Проблемы: FCM не гарантирует доставку, сообщение может прийти через 6 часов или не прийти вообще, а на iOS background push не разбудит приложение, если оно принудительно закрыто пользователем.

Надёжная схема выглядит иначе:

  1. Сервер помечает устройство как «подлежащее вайпу» в БД (флаг wipe_requested_at)
  2. При каждом API-запросе сервер возвращает в заголовке X-Wipe-Required: true (или 403 с кодом WIPE_REQUIRED)
  3. Приложение при старте делает health-check запрос и проверяет этот флаг
  4. FCM/APNs отправляет команду как дополнительный сигнал — не основной
// Interceptor для OkHttp — проверяем каждый ответ
class WipeCheckInterceptor(private val wipeManager: WipeManager) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val response = chain.proceed(chain.request())
        if (response.header("X-Wipe-Required") == "true") {
            wipeManager.scheduleImmediateWipe()
        }
        return response
    }
}

Если устройство было offline долгое время — при первом же запросе оно получит команду.

Сам процесс удаления

На Android:

class WipeManager(private val context: Context) {

    fun performWipe() {
        // 1. Инвалидируем токены на сервере (fire-and-forget)
        authRepository.revokeAllTokens()

        // 2. Удаляем SharedPreferences
        context.getSharedPreferences("corp_prefs", Context.MODE_PRIVATE)
            .edit().clear().commit()  // commit(), не apply() — синхронно

        // 3. Удаляем файлы
        context.filesDir.deleteRecursively()
        context.cacheDir.deleteRecursively()

        // 4. Удаляем ключи из Keystore
        val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
        keyStore.aliases().toList().filter { it.startsWith("corp_") }.forEach {
            keyStore.deleteEntry(it)
        }

        // 5. Чистим базу данных
        context.deleteDatabase("corp_database")

        // 6. Уведомляем сервер об успешном wipe
        auditRepository.reportWipeCompleted(deviceId)

        // 7. Перезапускаем приложение на экран логина
        restartToLoginScreen()
    }
}

Важный момент: apply() в SharedPreferences асинхронный. Если после него приложение крашнется — данные могут остаться. Только commit().

На iOS аналогично, но через UserDefaults.removePersistentDomain() и SecItemDelete() для Keychain:

func performWipe() {
    // Keychain
    let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                kSecAttrService as String: "com.company.corp"]
    SecItemDelete(query as CFDictionary)

    // UserDefaults
    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

    // Core Data
    try? FileManager.default.removeItem(at: coreDataStoreURL)
}

Проблема: wipe во время работы приложения

Если пользователь активно работает в момент получения команды — нельзя просто удалить базу данных. Сначала нужно завершить все активные транзакции, закрыть соединения с БД, остановить фоновые работы (WorkManager.cancelAllWork() на Android, BGTaskScheduler на iOS), и только потом удалять данные.

Без этого на Android 12+ возникает SQLiteDatabaseLockedException, и wipe не завершается полностью.

Аудит выполнения

После каждого wipe сервер должен получить подтверждение с временной меткой. Если подтверждение не пришло через N часов — повторить команду при следующем подключении. Лог wipe-операций хранится на сервере, не на устройстве.

Сроки

Базовая реализация (без Work Profile, только приложение): 2–3 дня. С поддержкой Android Enterprise и интеграцией в MDM-консоль — от 5 дней.