Реалізація системи дозволів для міні-програм у 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
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація системи розрішень для мініпрограм у 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 днів.