# iOS Widget（任务清单，V1 写死文案）

> 说明：本清单根据 `plan.md` 拆解，要求“可执行、可验收、可标记”。  
> 标记规则：执行完成后将对应项从 `- [ ]` 改为 `- [x]`，并把“状态”改为 **已完成**；进行中改为 **进行中**；阻塞写明原因与解除条件。

## 0. 清单状态说明

- **状态**：未开始 / 进行中 / 已完成 / 阻塞
- **阻塞**：必须写明阻塞点与解除条件

## 1. 预构建 iOS 原生工程（必须）

- [x] **执行 prebuild 生成 `ios/` 目录**  
  - **状态**：已完成（已执行 `npx expo prebuild -p ios --no-install`，已生成 `client/ios/`）  
  - **命令**：

```bash
cd client
npx expo prebuild -p ios
```

  - **产出**：`client/ios/`（包含 Xcode 工程）  
  - **验收**：`client/ios/` 目录存在，并能在 Xcode 打开

## 2. 创建 WidgetKit Extension（Xcode 操作）

- [x] **在 Xcode 新建 Widget Extension（WidgetKit）**  
  - **状态**：已完成（已创建 Target：情绪小组件；下一步把 Swift 文件加入该 Target 并跑模拟器验证）  
  - **操作**：
    - 打开 `client/ios/*.xcworkspace`（优先 workspace）
    - `File -> New -> Target... -> Widget Extension`
    - 名称建议：`MindfulnessWidget`（或你喜欢的命名）
  - **验收**：工程里新增 Widget target，能编译通过
  - **下一步（必须做）**：
    - 把 `client/ios/MindfulnessWidget/MindfulnessWidget.swift` 加入 Target Membership：`情绪小组件`
    - 如果 Xcode 自动生成了同类的 Widget 主文件（例如 `情绪小组件.swift` / `*_Bundle.swift`），请确保最终只有一个 `@main struct ...: Widget` 入口（避免重复入口导致编译失败）

## 3. 实现写死文案（3 个尺寸都要）

- [x] **实现 Small/Medium/Large 三种尺寸布局**  
  - **状态**：已完成（已提供 `client/ios/MindfulnessWidget/MindfulnessWidget.swift` 写死文案 + 三尺寸布局代码骨架）  
  - **文案（写死）**：可先用一条默认文案，例如：`你已经很努力了，今天也值得被温柔对待。`
  - **要求**：
    - Small：一行标题 + 主文案（可截断）
    - Medium：主文案更完整（可多行）
    - Large：增加留白与排版层次（例如标题 + 文案 + 小注脚）
  - **验收**：三种尺寸均显示美观，无溢出/遮挡

## 4. 点击跳转到 Home（Deep Link）

- [x] **为 Widget 配置点击跳转 URL**  
  - **状态**：已完成（代码骨架已使用 `.widgetURL(URL(string: \"client:///(app)/home\")!)`）  
  - **URL**：`client:///(app)/home`
  - **实现**：在 Widget 中设置 `.widgetURL(URL(string: \"client:///(app)/home\")!)`
  - **验收**：点击小组件能打开 App 并进入 Home

## 5. 本地验证

- [ ] **在 iOS 模拟器运行并添加桌面小组件**  
  - **状态**：阻塞（需要本机 Xcode Run 安装后在模拟器桌面添加 Widget 验证）  
  - **步骤**：
    - Xcode Scheme 选择主 App（一般是 `client`），选择模拟器，点击 Run 安装 App
    - 回到桌面长按 -> “+” -> 搜索小组件 -> 添加 Small/Medium/Large
  - **验收**：小组件显示正确，点击跳转正确
  - **排查**：
    - 桌面搜索不到：通常是没有 Run 安装过主 App，或 Widget target 未加入编译
    - 点击不跳转：确认 Widget 里 `widgetURL` 为 `client:///(app)/home`，且 `app.json` 的 `scheme` 为 `client`
    - 仍然搜不到：检查 Widget Extension 的 Bundle Identifier 是否有效（本仓库已修正为 `com.damer.mindfulness.emotionwidget`），然后 Clean + 重新安装 App

## 6. 文档补充（可选但建议）

- [x] **在 `client/README.md` 增加“小组件开发（V1 写死文案）”说明**  
  - **状态**：已完成  
  - **内容**：
    - Expo Go 不支持
    - prebuild 命令
    - Xcode 创建 Widget Extension 的步骤
    - deep link：`client:///(app)/home`
  - **验收**：新同学照 README 可复现

