Реализация системы разрешений для мини-программ в Super App

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

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация системы разрешений для мини-программ в Super App
Сложная
~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

Реализация системы разрешений для мини-программ в Super App

Когда мини-программа внутри Super App хочет прочитать геолокацию или отправить уведомление — кто должен спрашивать у пользователя разрешение? Хост-приложение уже может иметь его. Мини-программа не должна иметь к нему прямого доступа. Между ними нужен permission broker.

Два слоя разрешений

Система разрешений для мини-программ — это не просто обёртка над системными ActivityCompat.requestPermissions. Здесь два независимых слоя:

Первый слой: платформенные разрешения — те же camera, location, contacts, что запрашивает любое Android/iOS приложение. Хост-приложение держит их у себя и делегирует мини-программе только то, что явно разрешено.

Второй слой: платформенные API разрешения — доступ к API самой Super App: хранилище профиля пользователя, история заказов, платёжные методы, контакты внутри экосистемы. Это полностью кастомный слой, системные разрешения здесь не помогают.

Манифест мини-программы

Каждая мини-программа поставляется с манифестом, где декларирует нужные permissions:

{
  "miniAppId": "com.partner.food_delivery",
  "version": "1.2.0",
  "permissions": {
    "system": ["LOCATION_FINE", "CAMERA"],
    "platform": ["USER_PROFILE_READ", "PAYMENT_INITIATE", "ORDER_HISTORY_READ"]
  },
  "permissionRationale": {
    "LOCATION_FINE": "Для расчёта адреса доставки",
    "CAMERA": "Для сканирования QR-кодов меню"
  }
}

При установке мини-программы пользователь видит список запрашиваемых разрешений — как при установке обычного Android-приложения. Разрешения, не задекларированные в манифесте, недоступны даже если хост их имеет.

Permission Broker на стороне хоста

Центральный компонент — broker, который проверяет все обращения к нативным API:

class MiniAppPermissionBroker(
    private val permissionStore: MiniAppPermissionStore,
    private val systemPermissionDelegate: SystemPermissionDelegate
) {

    suspend fun requestPermission(
        miniAppId: String,
        permission: MiniAppPermission,
        context: Activity
    ): PermissionResult {

        // 1. Задекларирована ли в манифесте?
        if (!manifestValidator.isDeclared(miniAppId, permission)) {
            return PermissionResult.DENIED_NOT_DECLARED
        }

        // 2. Уже выдана?
        val stored = permissionStore.getStatus(miniAppId, permission)
        if (stored == PermissionStatus.GRANTED) return PermissionResult.GRANTED
        if (stored == PermissionStatus.DENIED_PERMANENTLY) return PermissionResult.DENIED_PERMANENTLY

        // 3. Для системных разрешений — проверяем хост, потом запрашиваем
        if (permission.isSystemPermission()) {
            val hostHas = systemPermissionDelegate.hasPermission(permission.androidName)
            if (!hostHas) {
                // Запрашиваем у пользователя от имени хоста
                val result = systemPermissionDelegate.request(permission.androidName, context)
                if (result != GRANTED) return PermissionResult.DENIED_BY_USER
            }
        }

        // 4. Показываем платформенный диалог разрешения
        val userDecision = showPermissionDialog(miniAppId, permission, context)
        permissionStore.save(miniAppId, permission, userDecision)
        return userDecision
    }
}

Управление разрешениями пользователем

Пользователь должен иметь возможность отозвать любое разрешение в любой момент. В настройках Super App — экран с перечнем установленных мини-программ и их разрешений:

Мини-программа: "Доставка еды"
├── Геолокация (точная) ............. ВКЛ  [переключатель]
├── Камера .......................... ВЫК  [переключатель]
├── Профиль пользователя ............ ВКЛ  [переключатель]
└── История заказов ................. ВКЛ  [переключатель]

Отзыв разрешения работает сразу — без перезапуска мини-программы. Broker при следующем вызове API вернёт PERMISSION_REVOKED, и мини-программа должна корректно обработать эту ошибку.

Runtime проверка при каждом вызове API

Разрешения могут быть отозваны асинхронно — пока мини-программа работает. Поэтому каждый вызов платформенного API проходит через broker, а не только при инициализации:

// Вызов из JS-моста
@JavascriptInterface
fun getUserLocation(callbackId: String) {
    val miniAppId = currentMiniAppContext.id

    coroutineScope.launch {
        when (permissionBroker.checkPermission(miniAppId, MiniAppPermission.LOCATION_FINE)) {
            PermissionResult.GRANTED -> {
                val location = locationProvider.getLastLocation()
                bridge.sendSuccess(callbackId, location.toJson())
            }
            PermissionResult.DENIED_PERMANENTLY -> {
                bridge.sendError(callbackId, "PERMISSION_DENIED_PERMANENTLY")
            }
            else -> {
                bridge.sendError(callbackId, "PERMISSION_REQUIRED")
            }
        }
    }
}

Аудит использования разрешений

Каждое обращение к чувствительному API логируется: timestamp, miniAppId, permission, был ли granted или denied. Это позволяет обнаружить мини-программу, которая запрашивает геолокацию каждые 5 секунд в фоне — и заблокировать её на платформе.

Сроки

Система разрешений с двумя слоями, UI настроек и audit trail: 2–3 дня при наличии готового permission store. Если разрабатывается с нуля включая манифест-валидатор и экраны управления — 4–6 дней.