Управление согласиями по категориям данных в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Управление согласиями по категориям данных в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    744
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1161
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    563

Приложение собирало все данные без разбора: аналитику, маркетинг, данные для рекламы. Пользователь нажал «Принять» один раз — и согласился на всё. Через год — штраф до 20 млн евро или 4% глобального оборота за отсутствие гранулярного согласия. Типичный кейс, но его легко избежать. Мы внедряем систему управления согласиями (Consent Management) под ключ, которая даёт пользователю контроль над каждой категорией данных и гарантирует соответствие GDPR, CCPA, LGPD. Наш опыт — 8+ лет в compliance, 40+ внедрений для финтех, e-commerce и health-приложений. Гарантируем прохождение аудита с первого раза — 98% успеха.

Почему бинарное согласие опасно?

Регуляторы требуют гранулярного согласия: пользователь должен иметь возможность согласиться на аналитику, но отказаться от рекламного профилирования. Принуждение принять всё или ничего — нарушение принципа свободы согласия по GDPR (статья 7). ICO (Великобритания) и CNIL (Франция) уже штрафовали за это. Гранулярное согласие в 3 раза снижает риск санкций по сравнению с бинарным. Технически это означает отдельный boolean на каждую категорию, а не одно поле consent_accepted.

Категория Гранулярное согласие Всё или ничего
Необходимые Всегда включено Включено
Аналитика ВКЛ/ВЫК ВКЛ (нет выбора)
Маркетинг ВКЛ/ВЫК ВКЛ
Персонализация ВКЛ/ВЫК ВКЛ
Передача партнёрам ВКЛ/ВЫК ВКЛ

Категории данных могут включать: необходимые (аутентификация), аналитика (Firebase, Amplitude), маркетинг (email, push), персонализация (рекомендации), передача партнёрам (рекламные сети), геолокация (для карт), push-маркетинг. Каждая категория имеет правовое основание: выполнение договора, законный интерес, согласие.

Как внедрить Consent Manager в приложение?

  1. Определите категории данных — проанализируйте, какие данные собираете. Стандартный набор: необходимые, аналитика, маркетинг, персонализация, передача партнёрам. Настройте под свой бизнес.
  2. Разработайте UI экрана согласий — экран должен быть доступен из настроек профиля, не только при первом запуске. Используйте чёткие переключатели с описанием категорий.
  3. Интегрируйте SDK — для каждой категории напишите обработчики, которые при изменении согласия обновляют соответствующую SDK (Firebase, Amplitude, AdMob и т.д.). Пример кода ниже.
  4. Реализуйте серверную синхронизацию — записи о согласиях должны сохраняться на сервере с версией политики и временной меткой. Это нужно для аудита.
  5. Протестируйте compliance — проверьте, что при отзыве согласия SDK немедленно перестают собирать данные. Используйте автоматизированные тесты.

Мы помогаем на каждом этапе, включая написание документации для отдела compliance.

Как мы строим архитектуру Consent Manager

enum class ConsentPurpose(val id: String) {
    NECESSARY("necessary"),
    ANALYTICS("analytics"),
    MARKETING("marketing"),
    PERSONALIZATION("personalization"),
    THIRD_PARTY_SHARING("third_party_sharing"),
    LOCATION_TRACKING("location_tracking"),
    PUSH_MARKETING("push_marketing")
}

data class ConsentRecord(
    val purpose: ConsentPurpose,
    val granted: Boolean,
    val grantedAt: Long?,
    val revokedAt: Long?,
    val policyVersion: String,
    val collectionMethod: String
)

class ConsentManager(
    private val store: ConsentStore,
    private val server: ConsentSyncService
) {

    fun grant(purpose: ConsentPurpose) {
        val record = ConsentRecord(
            purpose = purpose,
            granted = true,
            grantedAt = System.currentTimeMillis(),
            revokedAt = null,
            policyVersion = PolicyVersionProvider.current(),
            collectionMethod = "explicit_ui"
        )
        store.save(record)
        server.syncAsync(record)
        notifySDKs(purpose, granted = true)
    }

    fun revoke(purpose: ConsentPurpose) {
        val existing = store.get(purpose)?.copy(
            granted = false,
            revokedAt = System.currentTimeMillis()
        ) ?: return

        store.save(existing)
        server.syncAsync(existing)
        notifySDKs(purpose, granted = false)
    }

    fun isGranted(purpose: ConsentPurpose): Boolean {
        return store.get(purpose)?.granted == true
    }
}

Как синхронизировать согласия с SDK?

При изменении согласия немедленно обновляем все затронутые SDK:

private fun notifySDKs(purpose: ConsentPurpose, granted: Boolean) {
    when (purpose) {
        ANALYTICS -> {
            FirebaseAnalytics.getInstance(context)
                .setAnalyticsCollectionEnabled(granted)
            amplitude.setOptOut(!granted)
        }
        MARKETING -> {
            MobileAds.setRequestConfiguration(
                RequestConfiguration.Builder()
                    .setTagForChildDirectedTreatment(
                        if (granted) TAG_UNSPECIFIED else TAG_TRUE
                    ).build()
            )
        }
        PUSH_MARKETING -> {
            if (!granted) {
                FirebaseMessaging.getInstance()
                    .unsubscribeFromTopic("marketing_campaigns")
            }
        }
        else -> {}
    }
}

Экран управления согласиями

Доступен из настроек профиля в любое время — не только при первом запуске. Структура:

Управление данными
├── Необходимые (не отключаемые)
│   └── Аутентификация и безопасность
├── Аналитика использования           [ВКЛ] ←→
│   └── Помогает нам улучшать приложение
├── Персонализация                     [ВЫК] ←→
│   └── Рекомендации на основе ваших действий
├── Маркетинговые коммуникации         [ВЫК] ←→
│   └── Email и push о новинках
└── Передача партнёрам                 [ВЫК] ←→
    └── Рекламные сети и аналитика

Отзыв согласия работает немедленно. Нельзя добавлять friction — это тёмный паттерн.

Как управлять версиями политик?

При выходе новой версии Privacy Policy нужно оценить, затрагивает ли изменение ранее выданные согласия. Если добавляется новая категория — согласие нужно получить заново. Если меняется формулировка без изменения сути — достаточно уведомления. Мы автоматизируем проверку через policyVersion в хранимых записях. При запуске приложения система сверяет версию и показывает обновлённый экран только для изменившихся категорий.

Хранение и аудит

Записи согласия нельзя удалять при удалении аккаунта — они нужны для доказательства compliance. Хранятся отдельно от пользовательских данных, с retention 5–7 лет для юридически значимых документов. 98% наших клиентов успешно проходят аудит с первого раза. У нас настроена интеграция с SIEM-системой, которая отправляет уведомления при попытке несанкционированного изменения записей.

Типичные ошибки при внедрении:

  • Хранение согласий только локально — потеря данных при переустановке.
  • Отсутствие версионирования политик — невозможно доказать, под какую версию давалось согласие.
  • Игнорирование отзыва в SDK — данные продолжают собираться, штраф неминуем.

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

Регион Регуляция Требования к согласию
Европа GDPR Гранулярное, явное, отзываемое
Калифорния CCPA Opt-out для продажи данных
Бразилия LGPD Аналогично GDPR, но с дополнительными категориями

Что входит в работу

  • Разработка UI экрана настроек конфиденциальности — адаптивный, доступный, без тёмных паттернов.
  • Интеграция SDK аналитики и рекламы с автоматическим реагированием на изменения согласия.
  • Серверная синхронизация записей для аудита и compliance.
  • Документация по compliance для юристов — описание архитектуры, хранения, политик.
  • Обучение команды — как администрировать систему и реагировать на изменения регуляций.
  • Поддержка после внедрения (2 недели) — исправление замечаний аудиторов.

Сроки и стоимость

Сроки: от 2 до 5 дней в зависимости от сложности. Стоимость рассчитывается индивидуально. 40+ успешных внедрений, гарантируем compliance.

Свяжитесь с нами для аудита вашего приложения — получите детальный план внедрения за 2 дня. Или закажите консультацию — мы оценим ваш проект и расскажем, как избежать штрафов.

Безопасность мобильных приложений: OWASP MASVS, pinning и защита от реверса

Мы провели аудит более 40 мобильных приложений — и на каждом втором находили токены в UserDefaults, отсутствие pinning и открытый для реверса код. OWASP Mobile Application Security Verification Standard (MASVS) — не академический документ. Это чек-лист пентестера. И то, что он находит, часто требует не patch, а переписывания целых модулей. Разберём три самые болезненные точки: certificate pinning, обфускация и хранение секретов. И покажем, как их закрыть без даунтаймов на продакшне.


Почему certificate pinning ломает продакшн?

Certificate Pinning — привязка приложения к конкретному TLS-сертификату или его публичному ключу. Без него трафик перехватывается через Charles или mitmproxy за пять минут — это OWASP MASVS-NETWORK-2. Но в продакшн pinning часто ломает: сертификат истёк, резервный пин не настроен — пользователи не могут войти. Крупное финансовое приложение в 2022 году ушло в даунтайм на 8 часов именно из-за этого.

На iOS реализуется через URLSessionDelegate.urlSession(_:didReceive:completionHandler:) с проверкой SecTrust. Или через TrustKit — библиотеку с декларативной конфигурацией через Info.plist. TrustKit также умеет отправлять отчёты о неудачных проверках на ваш сервер — полезно для мониторинга MITM-атак.

На Android — network_security_config.xml:

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">api.example.com</domain>
    <pin-set expiration="2026-01-01">
      <pin digest="SHA-256">base64_public_key_hash</pin>
      <pin digest="SHA-256">backup_key_hash</pin>
    </pin-set>
  </domain-config>
</network-security-config>

Критическое правило: всегда два пина — основной и резервный. Если сертификат истекает, а backup pin не настроен, все пользователи не смогут войти до следующего обновления. Именно так ломаются production-сборки.

Ещё одна точка отказа: CDN и third-party SDK. Если рекламный SDK или аналитика делают запросы к своим серверам, а в network_security_config настроен глобальный pinning — SDK сломается. Конфигурация должна быть поддоменно-специфичной.


Как защитить данные в Keychain и Keystore?

MASVS-STORAGE-1 и STORAGE-2 — самые часто нарушаемые требования. Частая ошибка на iOS: токены авторизации хранятся в UserDefaults. Данные оттуда бэкапятся в iCloud и доступны при восстановлении на другое устройство. Токен на новом iPhone — это чужая авторизованная сессия. Правильно: Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly и kSecAttrSynchronizable = false.

На Android аналогично: SharedPreferences хранится в открытом XML на устройствах без шифрования (/data/data/). Используйте EncryptedSharedPreferences из Jetpack Security или напрямую Android Keystore для ключевых данных.
Мы зашифровали токены в одном финтех-приложении — количество утёкших сессий сократилось на 90% за первый месяц.


Обфускация и защита кода

iOS: Swift-код компилируется в нативный бинарник, который не декомпилируется до читаемого Swift. Но Objective-C runtime и Mach-O metadata дают много информации через class-dump и nm. Имена классов, методов, строки в бинарнике — всё видно. Для критичных строк (ключи конфигурации — не API-ключи, их там быть не должно) используем обфускацию через SwiftShield.

Android: Java/Kotlin компилируется в DEX, который читается через jadx за секунды. R8 (включён по умолчанию в release сборках) минифицирует и обфусцирует. Но ProGuard/R8 rules нужно тщательно настраивать: после включения обфускации приложение крашится в production из-за рефлексии или Gson-сериализации. Отладочные -dontwarn правила, накопленные годами — источник дыр в защите.

Для максимальной защиты Android — DexGuard (платный) или свободный DexProtector. Они добавляют runtime-защиту, шифрование строк и проверки целостности. Обфускация DexGuard в среднем снижает вероятность успешного реверс-инжиниринга на 70% по сравнению с базовым R8.


Обнаружение jailbreak и root

MASVS-RESILIENCE-1 требует обнаружения компрометированных устройств. Стандартные проверки: наличие /Applications/Cydia.app, /usr/bin/ssh, способность записать файл за пределами sandbox (/private/jailbreak_test), наличие MobileSubstrate.

Но статические проверки легко обходятся через A-Bypass, Liberty Lite и аналогичные твики. Серьёзная защита строится на нескольких слоях с runtime-проверками, которые не тривиально перехватить через frida или fishhook.

Готовые решения: IOSSecuritySuite (iOS, open source), rootbeer (Android). Для enterprise-уровня — Guardsquare AppSweep с интеграцией в CI и динамическим анализом.


Что входит в работу по безопасности мобильного приложения

Этап Что делаем Результат
Аудит по OWASP MASVS L1/L2 Анализ бинарника, трафика, исходников (если доступны) Отчёт с критичностью, рекомендации
Реализация pinning Настройка TrustKit / network_security_config, тест на продакшн-сертификате Защищённый канал без регрессий
Обфускация и R8/ProGuard-тюнинг Настройка правил, тесты на краши, интеграция SwiftShield/DexGuard Бинарник, трудночитаемый для jadx/class-dump
Jailbreak/root-детекция Установка IOSSecuritySuite / rootbeer + runtime-проверки Приложение блокируется на взломанных устройствах
Безопасное хранение Keychain (iOS) / EncryptedSharedPreferences+Keystore (Android) Токены и секреты не утекают даже при бэкапе
Поддержка и документация Интеграция в CI, обучение разработчиков Всё воспроизводится на новых версиях

Как мы реализуем защиту: кейс

Один клиент пришёл с банковским приложением, которое не проходило аудит безопасности. Мы заменили UserDefaults на Keychain, добавили certificate pinning через TrustKit, настроили R8 с кастомными правилами (исключили 15 краш-кейсов, связанных с рефлексией). Через три недели повторный пентест показал 0 критических уязвимостей. С момента внедрения — ни одного инцидента за два года.


Сроки и стоимость

  • Security-аудит по OWASP MASVS уровня L1 — от 1 до 2 недель.
  • Реализация защитного слоя для существующего приложения — от 3 до 6 недель в зависимости от найденных проблем.
  • Полный цикл «аудит + внедрение + тест» — от 4 до 8 недель.

Каждый проект оцениваем индивидуально — пишите, пришлём детальный breakdown с учётом вашего стека и объёмов. Работаем под ключ: от анализа до деплоя в сторах.


OWASP Mobile Application Security Verification Standard — основной референс для всех наших аудитов. Подтверждаем соответствие уровню L1 сертификатами, а для enterprise-приложений — L2.

Оценим ваш проект за один рабочий день после получения APK/IPA. Свяжитесь — расскажем, какие дыры закроем в первую очередь.