移动端平台
同一套代码,三个运行目标
这套 Vue 源码会通过 Quasar modes + Capacitor + Tauri 编译成 3 种运行目标:
| 目标 | 模式 | 原生外壳 | JS 引擎 |
|---|---|---|---|
| Web SPA | quasar dev -m spa | 无(直接跑在浏览器里) | 浏览器 JS |
| PWA | quasar dev -m pwa | Service Worker | 浏览器 JS |
| Android | quasar build -m capacitor -T android | Capacitor 7 | 系统 WebView |
| iOS | quasar build -m capacitor -T ios | Capacitor 7 + WKWebView | 系统 WebView |
| Desktop | cargo tauri build(在 src-tauri/ 中执行) | Tauri 2 | 系统 WebView(Windows 用 Edge WebView2,macOS 用 WKWebView,Linux 用 webkit2gtk) |
Android(Capacitor 7)细节
App id 是 app.aiaw.glass。AndroidManifest.xml 中声明了这些权限:
INTERNET、ACCESS_NETWORK_STATE—— 供网络请求使用CAMERA—— 声明了required=false,由 Capacitor Camera 插件使用READ_EXTERNAL_STORAGE—— API 32 及以下读取外部存储READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO—— API 33+ 的细粒度媒体权限
运行时实际用到的 Capacitor 插件包括:
@capacitor/core7.0@capacitor/app7.0 —— 生命周期(返回键、pause/resume)@capacitor/camera6.1 —— 拍照@capacitor/clipboard7.0@capacitor/filesystem7.0 —— 读写 app 沙箱文件@capacitor/ios7.0@capacitor/keyboard7.0 ——capacitor.config.ts中启用了resizeOnFullScreen: true@capacitor/status-bar7.0@capawesome/capacitor-android-edge-to-edge-support7.1 —— Android 15 沉浸式边到边模式(backgroundColor: '#00ffffff')@capawesome/capacitor-file-picker7.2@capawesome/capacitor-live-update7.1 —— OTA Web bundle 热更新@capgo/capacitor-printer8.0 —— 原生打印对话框capacitor-export-file0.0.1 —— 把 Blob/ArrayBuffer 保存到Documents/AiaW/capacitor-plugin-shell-exec1.3 —— file-ops 插件依赖的原生子进程能力capacitor-stream-fetch0.0.6 —— 流式 fetch(仅 Android,iOS 会回退到原生fetch)
Gradle 关键配置如下:
| 设置项 | 值 |
|---|---|
minSdkVersion | 23(Android 6.0) |
compileSdkVersion / targetSdkVersion | 35(Android 15) |
| Java | 17(source + target compatibility) |
applicationId | app.aiaw.glass |
versionCode / versionName | 20018 / 2.0.8.9 |
| release build | minifyEnabled true、启用 proguard、但仍使用 debug key 签名(正式发布前你要自己替换) |
Desktop(Tauri 2)细节
桌面窗口默认尺寸是 1150x750,可调整大小,禁用了 drag-drop。当前 CSP 配置为 null(开发环境依赖 Quasar dev server 注入头;正式发布前应重新审核生产 CSP)。
Tauri 侧使用的插件有:
@tauri-apps/plugin-clipboard-manager2.2@tauri-apps/plugin-opener2.2 —— 用系统浏览器打开 URL@tauri-apps/plugin-os2.2 —— 检测platform()@tauri-apps/plugin-process2.2@tauri-apps/plugin-shell2.2 —— 用来启动子进程(MCP 的stdio依赖它)@tauri-apps/plugin-updater2.5 —— 从https://github.com/NitroRCr/AIaW/releases/latest/download/latest.json拉取签名更新包@tauri-apps/plugin-window-state2.2
打包目标包括 deb、appimage、nsis、app、dmg。更新签名公钥仍然内嵌的是上游 NitroRCr 的 key;如果你要自己分发,这里必须换成你自己的。
PWA 细节
PWA 依赖 src-pwa/ 中的 Workbox service worker:
manifest.json—— 应用元数据、图标、theme colorcustom-service-worker.js—— 手写 service worker,用于额外缓存策略register-service-worker.js—— 注册入口
navigateFallbackDenylist 配置为 [/^/budget//],也就是 budget 路由不会走 SPA fallback。这个 service worker 由 Quasar 的 workboxMode: 'GenerateSW' 生成。
平台特定运行时文件
| 文件 | 用途 |
|---|---|
android/app/src/main/AndroidManifest.xml | 权限、Activity、网络安全配置 |
android/app/src/main/res/xml/network_security_config.xml | usesCleartextTraffic: true,允许本地 Ollama 之类的 HTTP 服务 |
android/variables.gradle | 锁定 SDK 版本与 support library 版本 |
src-tauri/tauri.conf.json | Tauri 窗口、bundle、updater 配置 |
src-tauri/capabilities/default.json | Tauri 权限 capability 配置 |
src-tauri/Cargo.toml | Rust 依赖;tauri 2.2 与若干 tauri-plugin-* 2.x 插件 |
src-tauri/src/main.rs | 入口文件,调用 app_lib::run() |
src-pwa/manifest.json | PWA 安装元数据 |