移动端平台

同一套代码,三个运行目标

这套 Vue 源码会通过 Quasar modes + Capacitor + Tauri 编译成 3 种运行目标:

目标模式原生外壳JS 引擎
Web SPAquasar dev -m spa无(直接跑在浏览器里)浏览器 JS
PWAquasar dev -m pwaService Worker浏览器 JS
Androidquasar build -m capacitor -T androidCapacitor 7系统 WebView
iOSquasar build -m capacitor -T iosCapacitor 7 + WKWebView系统 WebView
Desktopcargo tauri build(在 src-tauri/ 中执行)Tauri 2系统 WebView(Windows 用 Edge WebView2,macOS 用 WKWebView,Linux 用 webkit2gtk)

Android(Capacitor 7)细节

App id 是 app.aiaw.glassAndroidManifest.xml 中声明了这些权限:

  • INTERNETACCESS_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/core 7.0
  • @capacitor/app 7.0 —— 生命周期(返回键、pause/resume)
  • @capacitor/camera 6.1 —— 拍照
  • @capacitor/clipboard 7.0
  • @capacitor/filesystem 7.0 —— 读写 app 沙箱文件
  • @capacitor/ios 7.0
  • @capacitor/keyboard 7.0 —— capacitor.config.ts 中启用了 resizeOnFullScreen: true
  • @capacitor/status-bar 7.0
  • @capawesome/capacitor-android-edge-to-edge-support 7.1 —— Android 15 沉浸式边到边模式(backgroundColor: '#00ffffff'
  • @capawesome/capacitor-file-picker 7.2
  • @capawesome/capacitor-live-update 7.1 —— OTA Web bundle 热更新
  • @capgo/capacitor-printer 8.0 —— 原生打印对话框
  • capacitor-export-file 0.0.1 —— 把 Blob/ArrayBuffer 保存到 Documents/AiaW/
  • capacitor-plugin-shell-exec 1.3 —— file-ops 插件依赖的原生子进程能力
  • capacitor-stream-fetch 0.0.6 —— 流式 fetch(仅 Android,iOS 会回退到原生 fetch

Gradle 关键配置如下:

设置项
minSdkVersion23(Android 6.0)
compileSdkVersion / targetSdkVersion35(Android 15)
Java17(source + target compatibility)
applicationIdapp.aiaw.glass
versionCode / versionName20018 / 2.0.8.9
release buildminifyEnabled true、启用 proguard、但仍使用 debug key 签名(正式发布前你要自己替换)

Desktop(Tauri 2)细节

桌面窗口默认尺寸是 1150x750,可调整大小,禁用了 drag-drop。当前 CSP 配置为 null(开发环境依赖 Quasar dev server 注入头;正式发布前应重新审核生产 CSP)。

Tauri 侧使用的插件有:

  • @tauri-apps/plugin-clipboard-manager 2.2
  • @tauri-apps/plugin-opener 2.2 —— 用系统浏览器打开 URL
  • @tauri-apps/plugin-os 2.2 —— 检测 platform()
  • @tauri-apps/plugin-process 2.2
  • @tauri-apps/plugin-shell 2.2 —— 用来启动子进程(MCP 的 stdio 依赖它)
  • @tauri-apps/plugin-updater 2.5 —— 从 https://github.com/NitroRCr/AIaW/releases/latest/download/latest.json 拉取签名更新包
  • @tauri-apps/plugin-window-state 2.2

打包目标包括 debappimagensisappdmg。更新签名公钥仍然内嵌的是上游 NitroRCr 的 key;如果你要自己分发,这里必须换成你自己的。

PWA 细节

PWA 依赖 src-pwa/ 中的 Workbox service worker:

  • manifest.json —— 应用元数据、图标、theme color
  • custom-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.xmlusesCleartextTraffic: true,允许本地 Ollama 之类的 HTTP 服务
android/variables.gradle锁定 SDK 版本与 support library 版本
src-tauri/tauri.conf.jsonTauri 窗口、bundle、updater 配置
src-tauri/capabilities/default.jsonTauri 权限 capability 配置
src-tauri/Cargo.tomlRust 依赖;tauri 2.2 与若干 tauri-plugin-* 2.x 插件
src-tauri/src/main.rs入口文件,调用 app_lib::run()
src-pwa/manifest.jsonPWA 安装元数据