# 0004 只保留 Web,移除 Capacitor 原生壳 - 状态:已采纳 - 日期:2026-10-21 - 关联:取代 [0003 原生 iOS App 与 monorepo 结构](./0003-native-ios-monorepo) ## 背景 - 仓库同时维护着三套东西:Nuxt Web 应用、Capacitor 的 iOS 壳、Capacitor 的 Android 壳。 - Capacitor 依赖比想象中深:登录走原生浏览器 + 原生回调 URL,暗色模式改原生状态栏,Android 有物理返回键处理, SSO 事务存在 `Preferences` 里。为此多出了 `nativeSso.ts`、`createNativeYunlefunAuthorizationAdapter`、 `resolveYunlefunSsoConfig` 的 `platform` 分支,以及 6 个只为原生分支存在的测试文件。 - 0003 决定用 SwiftUI 原生版替换 Capacitor 版,把 iOS 当作要上架收费的主力。但 SwiftUI 工程 (`apps/ios`)至今没有开工,Capacitor 壳反而成了长期负担:每次升级 `@capacitor/*` 都要在 Web 侧 重新验证原生分支,而这些分支在浏览器里根本走不到。 - 实际使用中,Web 版已经同时服务普通浏览器和云乐坊容器(`window.ylf` JSAPI),原生壳带来的能力 (状态栏配色、物理返回键、原生 SSO 回跳)都有 Web 侧的等价实现。 ## 方案对比 | 问题 | 方案 | 取舍 | | ---------- | ---------------------------- | ------------------------------------------------------------ | | 原生壳去留 | 保留 Capacitor iOS + Android | 两条壳都要跟 `@capacitor/*` 版本走;Web 侧原生分支长期没人跑 | | | 只删 Android,保留 iOS | iOS 壳仍在,Capacitor 依赖无法卸掉,清理不彻底 | | | **全部移除,只保留 Web** | 失去上架 App 与原生 SSO;换来单一代码路径和持续可维护的 Web | ## 决定 ### 删除 - `android/`、`ios/` 两个 Capacitor 原生壳工程。 - `capacitor.config.ts`、根 `ionic.config.json`。 - `scripts/android/`、`scripts/ios.sh`。 - 根与 `apps/web` 的 `package.json` 里全部 `@capacitor/*` 依赖,以及 `dev:android`、`build:android`、 `dev:ios`、`ios`、`android`、`open:ios`、`open:android`、`sync` 等脚本。 ### Web 侧去 Capacitor 化 - `composables/dark.ts`:只改 `meta[name="theme-color"]`,不再设置原生状态栏。 - `pages/tabs.vue`:移除 Android 物理返回键处理(浏览器自带返回,无需拦截)。 - `adapters/yunlefunAuth.ts`:删掉原生授权适配器和基于 `Preferences` 的事务存储,只保留 Web 授权适配器。 - `utils/nativeSso.ts`:整体删除。它的产物只是原生 SSO 的 PKCE 事务与回调解析,Web 端走 `@yunlefun/sso` 的顶层重定向,不需要。 - `utils/yunlefunAuth.ts` / `utils/yunlefunSsoConfig.ts`:控制器和配置解析去掉 `platform` 分支, 只保留 Web 一种形态。 - `nuxt.config.ts`:去掉 `yunlefunSsoNativeClientId` / `yunlefunSsoNativeRedirectUri`。 ### 保留 - `@nuxtjs/ionic` 与 Ionic UI:Ionic 是 Web UI 框架,与 Capacitor 无关。 - `utils/yunleHost.ts` 与云乐坊容器(`window.ylf`)集成:这是 Web 被嵌入第三方 App 容器时的适配层, 和 Capacitor 无关。 - PWA 安装、Service Worker、离线能力:都是 Web 能力。 ## 影响 - 不再有 iOS / Android 安装包。若之后要上架,需要另起仓库做原生工程,而不是把 Capacitor 壳捡回来。 - 云乐坊 SSO 在 Web 上继续可用:容器内走宿主授权面板,容器外走顶层重定向回到 `https://cook.yunyoujun.cn/auth/callback`。PKCE 与 HTTPS 回跳地址的约束不变。 - `docs/dev/ios-roadmap.md` 与 `docs/decisions/0003-native-ios-monorepo.md` 随之作废。 - `@nuxtjs/ionic` 自身仍会传递依赖 `@capacitor/cli` / `@capacitor/core`(构建期使用,运行时不会调用), `pnpm-workspace.yaml` 里对应的 override 保留。