Ship native iOS app, Wiki/TTS backend, and skeleton loading UX.

Replace the WebView shell with SwiftUI screens, add account-scoped Wiki and TTS APIs with adaptive review and photo scan support, and keep web/iOS pages usable while data loads asynchronously.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-08 15:13:59 +08:00
parent db5465c646
commit 05e173b293
115 changed files with 12709 additions and 1212 deletions
+30 -34
View File
@@ -1,25 +1,6 @@
# WordLoop iOS App
原生 iOS 壳应用,内嵌最新 Vue 前端构建产物,通过 `WKWebView` 展示,API 指向所选服务器
## 与 H5 同步
Xcode 编译前会自动执行 `ios/scripts/build-web-assets.sh`,将 `frontend/` 最新代码构建并复制到 App 包内的 `www/`。因此首页(日常积累 / 词书练习双模式)、设置页(微信风格账号安全)等与本地 H5 保持一致,不依赖生产站是否已部署新版。
手动构建前端资源:
```bash
bash ios/scripts/build-web-assets.sh
```
## 服务器配置
| 环境 | API 地址 | 说明 |
|------|----------|------|
| **生产** | `https://w.tkmind.cn/api` | 默认环境 |
| **本地** | `http://127.0.0.1:18004/api` | 对应 `./start.sh` 后端;真机请改为电脑局域网 IP |
底部可展开切换服务器。界面与登录在同一 WebView,勾选「记住登录状态」后下次打开自动进入首页。
原生 SwiftUI 应用,直接调用生产服务器 API,不再内嵌 Vue 前端
## 打开工程
@@ -29,24 +10,39 @@ open ios/WordLoop/WordLoop.xcodeproj
在 Xcode 中选择你的 **Team**Signing & Capabilities),然后运行到模拟器或真机。
## 本地调试
## 服务器配置
1. 项目根目录启动服务:
API 固定为 `https://w.tkmind.cn/api`,可在 `Models/ServerEnvironment.swift` 修改。
```bash
./start.sh
```
2. iOS 模拟器:底部展开服务器栏,选「本地服务器」,默认 `http://127.0.0.1:18003`API 自动映射到 18004)。
3. 真机:将本地地址改为 Mac 局域网 IP,例如 `http://192.168.1.8:18003`
登录 Token 保存在 Keychain,勾选「记住登录状态」后下次打开自动进入首页。
## 架构说明
- **原生层**SwiftUI + WKWebView + 底部服务器栏
- **界面层**内嵌 `frontend` 构建产物,经 `wordloop://` 本地协议加载(避免 `file://` 白屏)
- **数据层**请求发往所选服务器 `/api`
- **UI 层**SwiftUI(登录、首页、测验、记忆曲线、对话、设置等)
- **网络层**`APIClient` + `URLSession`Bearer Token 鉴权
- **数据层**FastAPI 生产服务器 `/api`
内嵌页通过 `loadFileURL` 加载 Bundle 内 `www/index.html``app.js` / `app.css` 为独立外链文件(**不要**内联进 HTML,否则 WebKit 解析超大 `<script>` 会触发 `std::overflow_error` 崩溃)。构建时脚本放在 `</body>` 前,确保 `#app` 已存在。
## 功能对照
若出现白屏,请先执行 `bash ios/scripts/build-web-assets.sh`,再在 Xcode **Product → Clean Build Folder** 后重新 Run。
| 功能 | 原生页面 |
|------|----------|
| 登录 / 注册 | `LoginView` / `RegisterView` |
| 首页双模式 | `DashboardView` |
| 选择题练习 | `DailyQuizView` |
| 拼写练习 | `SpellQuizView` |
| 错题库 | `ErrorBankView` |
| 记忆曲线 / 词库 | `WordLibraryView` |
| 记忆对话 | `MemoryCoachView` |
| 翻译加词 | `TranslateSheet` |
| 拍照录入 | `PhotoImportView`(服务端 OCR |
| 设置 / Wiki | `SettingsView` 及子页面 |
## 权限
`Info.plist` 已声明相机与相册权限。模拟器无真实相机,请用「从相册选择」测试拍照录入。
## 与 Web 版差异
- 词图可视化(`WordGraphCanvas`)目前简化为列表 + 曲线图,后续可补 SwiftUI Canvas 版
- 测验会话暂不做本地断点续练(Web 版有 localStorage 恢复)
- iOS 不再打包 `www/` 前端资源,编译更快