删除 android/、ios/ 两个 Capacitor 原生工程与 capacitor.config.ts、 ionic.config.json,以及 scripts/android、scripts/ios.sh 构建脚本; 根与 apps/web 的 @capacitor/* 依赖和相关 npm scripts 一并移除。 Web 侧去掉原生分支:登录只走云乐坊容器授权面板或顶层重定向, 暗色模式不再改原生状态栏,移除 Android 物理返回键处理。 保留 @nuxtjs/ionic(Web UI 框架)、云乐坊 window.ylf 桥接与 PWA。 决策记录见 docs/decisions/0004-web-only.md。
63 lines
3.9 KiB
Markdown
63 lines
3.9 KiB
Markdown
# 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 保留。
|