Платформенные адаптеры
Как одна и та же модель приложения работает на Windows, macOS, Linux, Android и iOS.
05 Платформенные адаптеры
Кроссплатформенность Axion строится на модели общий Core + platform-specific adapters. Одна и та же модель приложения работает на всех целевых платформах, тогда как реализация WebView и системных возможностей адаптируется под ОС.
5.1Platform Layer
AXION ENGINE
│
Cross-platform Core
│
┌─────────────┼─────────────┐
│ │ │
Desktop Mobile ...
│ │
┌────┼────┐ ┌──┴───┐
▼ ▼ ▼ ▼ ▼
Win Mac Linux Android iOS
Структура каталога platform/:
platform/ ├── windows/ ├── macos/ ├── linux/ ├── android/ └── ios/
Основная логика при этом остаётся общей. Адаптеры реализуют только системно-зависимые части.
5.2Desktop
На десктопных платформах WebView реализуется через системные компоненты:
| Платформа | WebView | Процесс | Сеть |
|---|---|---|---|
| Windows | WebView2 (Chromium) | ✅ std::process::Command | ✅ TCP / HTTP |
| macOS | WKWebView | ✅ | ✅ |
| Linux | WebKitGTK | ✅ | ✅ |
Capabilities process.execute и network.connect доступны на всех десктопных платформах. Приложение может проверить доступность:
const canExec = await axion.capabilities.has('process.execute');
const canNetwork = await axion.capabilities.check('network.connect', 'api.github.com');
5.3Mobile
На мобильных платформах доступны не все capabilities:
| Платформа | WebView | Process | Сеть | Файлы |
|---|---|---|---|---|
| Android | Android WebView | ❌ | ✅ | App storage / Document picker |
| iOS | WKWebView | ❌ | ✅ | App storage / Document picker |
filesystem.read на desktop даёт доступ к workspace, а на mobile — к app storage и document picker. Некоторые capabilities (например, process.execute) могут отсутствовать на iOS.5.4Проверка capabilities
Приложение не должно предполагать, что каждая capability доступна на каждой платформе. Используйте:
// Есть ли capability у приложения (заявлена в manifest)? const has = await axion.capabilities.has('process.execute'); // Покрывает ли capability конкретный target? const ok = await axion.capabilities.check('network.connect', 'api.example.com');