Реалізація системи міні-програм у мобільних додатках
Якщо super app — це платформа в цілому, то система міні-програм — конкретний технічний компонент цієї платформи. Йдеться про те, як саме міні-програма запускається всередині хост-додатка, як отримує доступ до нативних API, як оновлюється без ревізії в App Store та як ізолюється від інших програм і хоста.
Runtime для міні-програм
Існують два кардинально різні підходи.
WebView-based. Міні-програма — це веб-додаток (React, Vue або кастомний DSL як у WeChat WXML/WXSS). Запускається в ізольованому WKWebView (iOS) або WebView (Android). Стандартні веб-технології, низький поріг входу для партнерів, кросс-платформний код міні-програм. Обмеження: продуктивність нижче нативної, немає доступу до складних нативних API без Bridge.
Native plugin-based. Міні-програма — скомпільований нативний код (Android: DEX через DexClassLoader; iOS: compile-time Swift Package). Нативна продуктивність, повний доступ до API через контрольовані інтерфейси. Обмеження: App Store забороняє завантаження виконуваного коду на iOS, тому нативні плагіни на iOS мають бути включені в бінарник під час компіляції.
На практиці використовуємо гібридний підхід: базові сервіси партнерів — WebView, критичні внутрішні міні-програми — нативні плагіни.
Формат пакету міні-програми
Міні-програма розповсюджується як zip-архів з маніфестом:
{
"id": "com.partner.loans",
"version": "2.3.1",
"minHostVersion": "3.0.0",
"entryPoint": "index.html",
"permissions": ["payment", "geolocation"],
"allowedDomains": ["api.partner.com", "cdn.partner.com"],
"signature": "sha256:abc123..."
}
Під час завантаження хост: верифікує підпис архіву (RSA-PSS з публічним ключем партнера), перевіряє сумісність minHostVersion, валідує permissions проти списку дозволених для партнера, розпаковує у ізольовану директорію. Запуск відбувається тільки після успішної верифікації.
Bridge API: дизайн та безпека
Bridge — єдина точка контакту між міні-програмою та хостом. Архітектура запит-відповідь:
На стороні міні-програми (JS):
MiniAppBridge.call('payment.pay', {
orderId: 'order-123',
amount: 99.99,
currency: 'USD'
}).then(result => {
// result.transactionId
}).catch(err => {
// err.code, err.message
});
На стороні хоста Bridge:
- Отримує виклик через
WKScriptMessageHandler.userContentController(_:didReceive:)(iOS) або@JavascriptInterfaceметод (Android) - Парсить
methodтаparams - Перевіряє: чи має ця міні-програма дозвіл викликати
payment.pay? - Якщо так — виконує нативний код (показує Payment UI, обробляє транзакцію)
- Повертає результат через
webView.evaluateJavaScript("MiniAppBridge._resolve(requestId, result)")
Кожен метод Bridge має явний список дозволів. Виклик методу без потрібного дозволу спричиняє синхронну помилку PERMISSION_DENIED. Дозволи видаються під час реєстрації партнера, зберігаються на сервері та кешуються в хосте.
Ізольоване сховище та сеанси
Кожна міні-програма отримує простір імен у локальному сховищі: ключі вида {mini_program_id}:{key}. Прямого доступу до SQLite або SharedPreferences хоста немає. Доступ тільки через Bridge методи storage.set / storage.get / storage.remove з примусовим простором імен.
WebView localStorage також ізольований: кожна міні-програма запускається з WKWebViewConfiguration з окремим WKWebsiteDataStore.nonPersistent() або названим постійним сховищем. На Android — WebStorage з кастомною директорією та запобіганням перетину origin.
Сеанс користувача. Міні-програма отримує токен доступу тільки через Bridge auth.getToken(). Хост видає токен на 15 хвилин, прив'язаний до mini_program_id, з обмеженою областю. Міні-програма ніколи не бачить master JWT користувача.
Оновлення міні-програм
Оновлення відбувається без ревізії в App Store. Послідовність:
- При запуску міні-програми (або фоново за розкладом) хост перевіряє поточну версію через
GET /mini-programs/{id}/version - Якщо сервер повертає новішу версію — завантажуємо архів у фоні
- Верифікуємо підпис нового архіву
- При наступному запуску міні-програми — активуємо новий пакет
- Попередня версія збереження як backup для rollback при потребі
Примусове оновлення: якщо minHostVersion нового пакету несумісна з поточним хостом — показуємо екран «Доступне оновлення додатка» замість запуску міні-програми.
Налагодження та DevTools для партнерів
Розробнику міні-програми потрібні зручні інструменти. Надаємо:
- Simulator mode: локальний сервер (
localhost:8080) як джерело міні-програми замість CDN — хост читає файли прямо без верифікації підпису (тільки debug build) - Bridge Inspector: логування всіх Bridge-викликів у debug консоль Xcode / Android Studio Logcat
- Mock Bridge: JS-бібліотека (
mini-program-bridge-mock) для тестування в браузері без хоста
Приклад. Екосистема партнерів маркетплейсу: 8 партнерів, 23 активних міні-програми (12 WebView, 11 нативних плагінів на Android / compile-time на iOS). Bridge API: 55 методів. Середній час холодного запуску міні-програми (перший у сеансі) — 380 мс на iPhone 14. Теплий запуск (повернення після паузи) — 80 мс. Фонове оновлення: 70% користувачів отримують нові версії міні-програм без перезапуску хоста.
Часові рамки реалізації системи міні-програм
| Компонент | Орієнтовна тривалість |
|---|---|
| WebView runtime + базовий Bridge (20 методів) | 8–12 тижнів |
| Маркетплейс + підписи + оновлення | +4–6 тижнів |
| Нативний plugin runtime (Android) | +4–8 тижнів |
| Partner SDK + DevTools | +4–6 тижнів |
Ціна розраховується індивідуально після аналізу вимог Bridge API, кількості партнерів та вимог безпеки.







