# ArtaBP-PRD-v1.0.0

## 1. 基本信息

| 项目    | 内容                                  |
| ----- | ----------------------------------- |
| 产品名称  | ArtaBP                              |
| 平台    | iOS                                 |
| 版本号   | v1.0.0                              |
| 文档状态  | 可执行版                                |
| 更新日期  | 2026-06-23                          |
| 产品定位  | Blood pressure tracker（血压记录与趋势管理工具） |
| 变现方式  | V1.0.0 暂不接订阅；广告是否接入以发布合规与开发实现确认为准   |
| 需求外链  | https://artabp-interactive-prototype.pages.dev/ |
| UI 外链 |                                     |

## 2. 竞品参考链接

| 竞品 | 平台 | 链接 | 参考点 |
|---|---|---|---|
| 待补充 | iOS |  | 首页信息层级、记录流程、趋势页、免责声明 |
| American Heart Association（美国心脏协会） | Web | https://www.heart.org/en/health-topics/high-blood-pressure/understanding-blood-pressure-readings | 默认血压参考范围、状态标签和非诊断说明参考 |

## 3. 本次目标

| 目标 | 说明 |
|---|---|
| 建立首版核心闭环 | 用户可以完成手动添加血压、扫描血压计、相机测量心率、查看历史、查看趋势、设置提醒 |
| 降低健康合规风险 | 明确产品为 wellness reference（健康参考），不做诊断、治疗或医疗建议 |
| 完成首版核心增值功能 | 支持 AI Insight（AI 解读）、PDF Report（PDF 报告）、OCR Scan（血压计识别） |
| 便于上架审核 | 相机检测能力按 wellness reference（健康参考）表达，不使用医疗诊断、治疗或医疗级准确测量表述 |

## 4. 本次范围

| 模块 | 本版本需求 |
|---|---|
| Splash（启动页） | 启动页展示品牌 |
| Onboarding（新手引导） | 首次引导，说明记录、趋势、提醒、健康参考边界 |
| Medical Disclaimer（医疗免责声明） | 首次使用必须确认免责声明 |
| Home（首页） | 展示最新记录、快捷添加、7 日概览、提醒入口 |
| Heart Rate Check（相机心率检测） | 相机测量心率：准备页、检测中、心率结果页、重测、AI 解读 |
| Add Reading（手动添加记录） | 手动添加血压记录，心率选填 |
| OCR Scan（血压计识别） | 扫描实体血压计屏幕，识别 SYS / DIA / Pulse，用户确认后保存 |
| History（历史） | 查看、筛选、编辑、删除历史记录 |
| Trends（趋势） | 查看 7 日 / 30 日趋势和统计 |
| AI Insight（AI 解读） | 生成单次血压、单次心率、7 日、30 日记录解读 |
| PDF Report（PDF 报告） | 生成 7 日 / 30 日 PDF 报告并调用系统分享 |
| Reminder（提醒） | 设置每日提醒 |
| Reference Range（参考范围） | 展示默认参考范围和状态说明 |
| Profile（设置） | 进入快捷功能、提醒、参考范围、免责声明、隐私政策、服务条款、反馈 |
| 数据本地存储 | 首版本地保存记录与用户设置 |
| 埋点 | 覆盖 OB、添加血压、心率检测、OCR、记录、历史、趋势、AI、PDF、提醒、设置核心行为 |

## 5. 页面需求

### 5.0 页面层级与入口关系

V1.0.0 使用 5 个底部 Tab：

| Tab | 一级页面 | 主要承载 |
|---|---|---|
| Home（首页） | Home（首页） | 最新记录、核心快捷入口、AI 解读入口、PDF 报告入口、提醒入口 |
| Trends（趋势） | Trends（趋势） | 7 日 / 30 日趋势、统计卡片、AI 解读入口、PDF 报告入口 |
| Add（添加） | Add Bottom Sheet（添加弹层） | Add Blood Pressure（添加血压）、Heart Rate Check（相机心率检测）、OCR Scan（血压计识别） |
| History（历史） | History（历史） | 历史记录、筛选、记录详情、编辑、删除 |
| Profile（设置） | Profile（设置） | 快捷功能、提醒、参考范围、隐私政策、服务条款、医疗免责声明、同开发者应用推荐 |

页面归属：

| 页面 | 层级 | 入口 |
|---|---|---|
| Splash（启动页） | 启动流程页 | 打开 App 自动进入 |
| Onboarding（新手引导） | 首次使用流程页 | Splash 后进入，仅首次展示 |
| Medical Disclaimer（医疗免责声明） | 首次使用确认页 / 设置页可回看 | Onboarding 后进入；Profile 可再次查看 |
| Home（首页） | 一级 Tab | 底部 Tab |
| Add Bottom Sheet（添加弹层） | 一级 Tab 触发弹层 | 点击 Add Tab 或 Home 快捷入口 |
| Heart Rate Check（相机心率检测页） | 二级功能页 | Home -> Heart；Add -> Measure Heart Rate |
| Heart Rate Result（心率检测结果页） | 二级结果页 | Heart Rate Check 检测成功后进入 |
| Add Reading（手动添加记录页） | 二级功能页 | Home -> Add Blood Pressure；Add -> Add Blood Pressure |
| Add Success（添加成功页） | 二级结果页 | Add Reading / OCR Confirm Result 保存成功后进入 |
| OCR Scan（血压计识别页） | 二级功能页 | Add -> Scan BP Monitor |
| OCR Confirm Result（识别结果确认页） | 二级结果页 | OCR Scan 识别成功后进入 |
| History（历史页） | 一级 Tab | 底部 Tab |
| Record Detail（记录详情页） | 二级详情页 | History -> 点击单条记录 |
| Trends（趋势页） | 一级 Tab | 底部 Tab |
| AI Insight（AI 解读页） | 二级功能页 | Home / Trends / Add Success / Heart Rate Result / PDF Report |
| PDF Report（PDF 报告页） | 二级功能页 | Home / Trends / AI Insight |
| Reminder Settings（提醒设置页） | 二级设置页 | Home Reminder 卡片 / Profile |
| Reference Range（参考范围页） | 二级设置页 | Profile |

首次用户流程：

- `onboarding_enabled = true`：`Splash（启动页） -> Onboarding（新手引导） -> Medical Disclaimer（医疗免责声明） -> Home（首页）`。
- `onboarding_enabled = false`：`Splash（启动页） -> Medical Disclaimer（医疗免责声明） -> Home（首页）`。

非首次用户流程：`Splash（启动页） -> Home（首页）`。

### 5.1 Splash（启动页）

页面归属：启动流程页。

页面目标：展示品牌，完成基础配置拉取，并在成功或失败后继续进入后续流程。

展示内容：

- Logo，需要做轻量动效。
- 产品名称：ArtaBP。
- Slogan：Check. Track. Stay Aware.（检测，记录，保持了解。）
- Progress bar（进度条）。
- Loading text（加载文案）。

关键交互：

- 用户不可操作，不提供跳过按钮。
- 页面自动拉取远程配置 / 基础配置。

规则 / 异常：

- 配置拉取成功：进入后续流程。
- 配置拉取失败：不阻断启动，仍进入后续流程；进入后续流程后继续在后台重试拉取配置，未成功前使用本地默认配置。
- 首次用户按中台参数 `onboarding_enabled` 决定是否进入 Onboarding（新手引导）；关闭 Onboarding 时仍必须进入 Medical Disclaimer（医疗免责声明）。
- 非首次用户进入 Home（首页）。
- 当 `notification_permission_surface = splash` 且用户尚未授权 Notification（通知）权限时，启动页配置完成后可触发通知权限请求；不得与广告、系统分享、相机权限或好评弹窗叠加。

页面文案：

```text
Preparing your health dashboard...

正在准备你的健康面板。
```

### 5.2 Onboarding（新手引导）

页面归属：首次使用流程页。

页面目标：让用户理解产品核心能力，并进入医疗免责声明确认。

展示内容：

- 每页采用图文结构：上方展示功能插图或产品场景图，下方展示标题和说明文案。
- 每页预留 Native Ad（原生广告）展示位置，默认放在说明文案下方、主按钮上方。
- Native Ad 仅在广告配置开启且广告加载成功时展示；广告加载失败时隐藏广告位，页面内容自然上移，不阻断 OB。

| 页面 | English Title | English Subtitle | 中文标题 | 中文副标题 |
|---|---|---|---|---|
| OB 1 | Track Your Blood Pressure | Keep a simple daily log of your blood pressure and pulse. | 记录你的血压 | 简单记录每天的血压和心率。 |
| OB 2 | Understand Your Trends | View recent changes with clear 7-day and 30-day charts. | 了解你的趋势 | 通过清晰的 7 日和 30 日图表查看近期变化。 |
| OB 3 | Build a Healthy Habit | Set reminders and keep your records updated. | 建立健康习惯 | 设置提醒，保持记录更新。 |

关键交互：

- `Next（下一步）`：进入下一页 OB。
- `Get Started（开始使用）`：完成 OB，进入 Medical Disclaimer（医疗免责声明）。

规则 / 异常：

- 仅首次用户展示。
- 完成后记录本地 OB 完成状态。
- Onboarding 是否展示由中台参数 `onboarding_enabled` 控制；关闭时首次用户跳过 Onboarding，但不跳过 Medical Disclaimer（医疗免责声明）。

### 5.3 Medical Disclaimer（医疗免责声明）

页面归属：首次使用确认页；Profile（设置）中可再次查看。

页面目标：在用户进入首页前完成健康合规确认。

展示内容：

- 免责声明标题。
- 免责声明正文。
- `I Understand（我已理解）` 按钮。

关键交互：

- 用户点击 `I Understand（我已理解）` 后进入 Home（首页）。

规则 / 异常：

- 该页面位于 Onboarding（新手引导）之后。
- 用户必须确认后才能进入 Home（首页）。
- 确认后本地记录 `disclaimer_agreed = true`。
- 后续可在 Profile（设置）中再次查看。

页面文案：

```text
For Wellness Reference Only

ArtaBP is a wellness reference app and is not intended to diagnose, treat, cure, or prevent any disease.

Blood pressure records, trends, and reminders are for informational purposes only and should not replace professional medical advice.

Always consult your doctor or other qualified healthcare provider with any questions about a medical condition.

仅作为健康参考

ArtaBP 是健康参考 App，不用于诊断、治疗、治愈或预防任何疾病。

血压记录、趋势和提醒仅供信息参考，不能替代专业医疗建议。

如有健康问题，请咨询医生或其他合格医疗专业人士。
```

### 5.4 Home（首页）

页面归属：一级 Tab。

页面目标：承接核心功能入口，展示最新记录和近期概览。

展示内容：

- 顶部问候语。
- Latest Reading（最新记录）。
- Add Blood Pressure（添加血压）主按钮。
- Heart（心率）快捷入口，进入相机心率检测。
- Scan（扫描）快捷入口，进入扫描血压计。
- AI（AI）快捷入口，进入 AI 解读。
- PDF（报告）快捷入口，进入 PDF 报告页。
- 7-Day Average（7 日平均）。
- Reminder（提醒）卡片。
- 底部 5 Tab。

关键交互：

- `Add Blood Pressure（添加血压）`：进入 Add Reading（手动添加记录页）。
- `Heart（心率）`：进入 Heart Rate Check（相机心率检测页）。
- `Scan（扫描）`：进入 OCR Scan（血压计识别页）。
- `AI（AI）`：进入 AI Insight（AI 解读页），默认使用最近记录。
- `PDF（报告）`：进入 PDF Report（PDF 报告页），不直接导出。
- `Reminder（提醒）`：进入 Reminder Settings（提醒设置页）。

规则 / 异常：

- 有记录时展示最新记录和 7 日平均。
- 无记录时展示空状态，引导 Add Blood Pressure（添加血压）。
- 数据不足时，AI Insight / PDF Report 入口可点击，但进入后展示数据不足提示。
- 首页没有任何血压记录且没有任何心率记录时，Latest Reading（最新记录）区域展示空状态卡片，不展示血压数值、心率数值、参考范围标签和 7-Day Average（7 日平均）图表。
- 首页空状态卡片主文案展示 `No readings yet.（还没有记录。）`，说明文案展示 `Add your first blood pressure reading to start tracking.（添加第一条血压记录，开始追踪变化。）`，主按钮展示 `Add Blood Pressure（添加血压）`。
- 首页空状态下保留 Heart（心率）、Scan（扫描）、AI（AI）、PDF（报告）快捷入口；Heart / Scan 可正常进入，AI / PDF 点击后进入对应页面并展示数据不足提示。
- 仅没有心率记录但已有血压记录时，不展示首页空状态；Latest Reading 正常展示血压，Pulse（心率）显示 `Pulse not recorded（心率未记录）` 或隐藏，按页面空间处理。
- 快捷入口使用短文案，完整说明放在页面备注或无障碍标签中，避免首页拥挤。
- 首页顶部主问候语根据本地时间展示 `Good morning（早上好）` / `Good afternoon（下午好）` / `Good evening（晚上好）`。
- 首页顶部副文案仅根据当天是否已有血压记录变化：无当天记录时展示 `Track your blood pressure today.（今天记录一下血压。）`；已有当天记录时展示 `Today's reading is saved.（今天的记录已保存。）`。
- 首页问候语不根据血压高低、提醒状态或 AI 状态变化，避免首页逻辑过重。
- Add Blood Pressure（添加血压）主按钮点击 / 按压时做轻微缩放动效。
- Heart（心率）/ Scan（扫描）/ AI（AI）/ PDF（报告）四个快捷入口 hover 或 press 时做轻微上浮或缩放动效；动效需克制，不影响工具型界面稳定感。
- 首页顶部问候语和副文案默认可双排展示；若小屏、动态字体或本地化文案导致空间不足，只保留单行主文案，隐藏副文案，不强制压缩、不拥挤换行。
- 当 `notification_permission_surface = home` 且用户尚未授权 Notification（通知）权限时，Home 首次曝光后可触发通知权限请求；不得与广告、系统分享、相机权限或好评弹窗叠加。

页面文案：

```text
Good morning
Good afternoon
Good evening

早上好
下午好
晚上好

Track your blood pressure today.
Today's reading is saved.

今天记录一下血压。
今天的记录已保存。

No blood pressure records yet.
Add your first blood pressure reading today.
No readings yet.
Add your first blood pressure reading to start tracking.
Pulse not recorded.

还没有血压记录。
今天添加第一条血压记录。
还没有记录。
添加第一条血压记录，开始追踪变化。
心率未记录。

Add Blood Pressure

添加血压

Heart
Scan
AI
PDF

心率
扫描
AI
报告

Latest Reading
7-Day Average

最新记录
7 日平均
```

### 5.5 Add Bottom Sheet（添加弹层）

页面归属：Add（添加）一级 Tab 触发弹层。

页面目标：集中承接添加血压、测量心率和扫描血压计。

展示内容：

- 标题：Add（添加）。
- 说明文案：Choose how to add your health data.（选择添加健康数据的方式。）
- Add Blood Pressure（添加血压）。
- Add Blood Pressure 说明：Enter SYS, DIA, and optional pulse（输入收缩压、舒张压和选填心率）。
- Heart Rate Check（相机心率检测）。
- Heart Rate Check 说明：Use the camera for a heart rate check（使用相机检测心率）。
- Scan BP Monitor（扫描血压计）。
- Scan BP Monitor 说明：Scan a blood pressure monitor screen（扫描血压计屏幕）。

关键交互：

- 点击 Add Blood Pressure（添加血压）：进入 Add Reading（手动添加记录页）。
- 点击 Heart Rate Check（相机心率检测）：进入 Heart Rate Check（相机心率检测页）。
- 点击 Scan BP Monitor（扫描血压计）：进入 OCR Scan（血压计识别页）。

规则 / 异常：

- Add Tab 不作为独立完整页面，点击后弹出 Bottom Sheet（底部弹层）。
- 弹层关闭后回到原页面。

页面文案：

```text
Add
Choose how to add your health data.
Add Blood Pressure
Enter SYS, DIA, and optional pulse
Heart Rate Check
Use the camera for a heart rate check
Scan BP Monitor
Scan a blood pressure monitor screen
Cancel

添加
选择添加健康数据的方式。
添加血压
输入收缩压、舒张压和选填心率
心率检测
使用相机检测心率
扫描血压计
扫描血压计屏幕
取消
```

### 5.6 Heart Rate Check（相机心率检测页）

页面归属：Add（添加）/ Home（首页）下的二级功能页。

页面目标：在同一个页面内完成相机心率检测的准备、检测中和失败处理。

展示内容：

- 准备态：手指覆盖摄像头指引、检测注意事项、Start Heart Check（开始测量）、Add Blood Pressure（添加血压）。
- 检测态：倒计时、进度环、动态波形、当前检测提示、取消按钮。
- 失败态：失败原因提示、Try Again（重试）、Enter Manually（手动输入）。

关键交互：

- `Start Check（开始检测）`：请求 Camera（相机）权限；权限通过后从准备态切换到检测态。
- 检测成功：跳转到 Heart Rate Result（心率检测结果页）。
- 检测失败：留在当前页面并切换到失败态。
- 检测中点击 Cancel（取消）或系统返回：弹出确认，不直接丢弃流程。
- 检测中取消确认弹窗点击 `Keep Checking（继续检测）`：关闭弹窗并继续当前检测。
- 检测中取消确认弹窗点击 `Cancel Check（取消检测）`：停止检测并回到准备态；不保存任何心率数据。
- `Add Blood Pressure（添加血压）`：进入 Add Reading（手动添加记录页）。

规则 / 异常：

- 权限拒绝时展示 Open Settings（打开设置）和 Add Blood Pressure（添加血压）。
- 检测时长 20-30 秒。
- 检测前和检测中不展示广告或打断弹窗。
- 检测态必须展示倒计时、进度环、动态波形、当前信号提示和取消按钮；倒计时结束前如果系统已得到稳定结果，可提前进入 Heart Rate Result（心率检测结果页）。
- 失败原因包括 `no_finger`、`too_much_movement`、`bad_signal`、`timeout`。
- `no_finger`：无法识别手指或 PPG 信号；提示用户轻轻覆盖摄像头。
- `too_much_movement`：检测中手指或设备移动过大；提示用户保持手指和手臂稳定。
- `bad_signal`：信号置信度不足、光线或覆盖方式不合格；提示用户调整覆盖方式并避免强光/反光。
- `timeout`：20-30 秒内未得到稳定结果；提示用户重新检测。
- 如果正式实现使用第三方 SDK，需将 SDK error code 映射到以上 4 类失败原因后再展示和上报。
- 失败状态由系统检测失败自动触发；正式 App 不展示 Simulate Failure（模拟失败）按钮。

页面文案：

```text
Place your fingertip gently on the camera.
Keep still during the check for best results.
Camera permission is needed to measure heart rate.
Checking your heart rate...
Please keep your finger still.
Cancel
Cancel this check?
The current heart rate check will stop and no result will be saved.
Keep Checking
Cancel Check
Try Again
Add Blood Pressure
We couldn't get a clear signal.
Why this might have happened
Too much movement
Bad signal
Rest your arm on a table and relax your hand for better results.

将指尖轻轻放在摄像头上。
检测过程中保持静止，以获得更好的结果。
测量心率需要相机权限。
正在检测你的心率。
请保持手指静止。
取消
取消本次检测？
当前心率检测将停止，不会保存任何结果。
继续检测
取消检测
重试
添加血压
没有获得清晰信号。
可能原因
动作太多
信号不好
把手臂放在桌上并放松手部，结果更好。
```

### 5.7 Heart Rate Result（心率检测结果页）

页面归属：Heart Rate Check（相机心率检测）结果页。

页面目标：展示检测结果，并引导用户查看 AI 解读、添加血压或重新检测。

展示内容：

- Pulse（心率）。
- Wellness reference only（仅作健康参考）。
- View AI Insight（查看 AI 解读）。
- Retake Test（重新检测）。
- Add Blood Pressure（添加血压）。

关键交互：

- 心率检测成功后自动作为心率参考记录保存，source = camera_heart_rate；不再单独展示 Save Heart Rate（保存心率）按钮。
- `View AI Insight（查看 AI 解读）`：进入 AI Insight（AI 解读页），默认上下文为 This Reading（本次心率）。
- `Add Blood Pressure（添加血压）`：进入 Add Reading（手动添加记录页）。
- `Retake Test（重新检测）`：返回 Heart Rate Check（相机心率检测页）的准备态。

规则 / 异常：

- 该页是心率检测后的结果页，不是 PDF Report（PDF 报告页）。
- 不新增心率保存成功页；Heart Rate Result（心率检测结果页）即为心率流程终点。
- 心率参考记录不覆盖首页 Latest Blood Pressure（最新血压记录）。
- 底部不再展示独立 Add Blood Pressure（添加血压）推荐卡片；Add Blood Pressure 作为页面按钮展示。
- 底部必须展示健康参考说明。
- 不展示 SYS / DIA，不暗示相机可以测量血压。

页面文案：

```text
Pulse
Wellness reference only
Camera-based heart rate results are for wellness reference only.
View AI Insight
Add Blood Pressure
Retake Test

心率
仅作健康参考
相机心率结果仅作健康参考。
查看 AI 解读
添加血压
重新检测
```

### 5.8 Add Reading（手动添加记录页）

页面归属：Add（添加）下的二级功能页；Home 主按钮也可进入。

页面目标：支持用户手动录入血压记录，心率作为选填补充信息。

展示内容：

- SYS（收缩压）。
- DIA（舒张压）。
- Pulse（心率），标注 Optional（选填）。
- Date（日期）。
- Time（时间）。
- Measurement Time（测量时段），标注 Optional（选填）。
- Body Status（身体状态），标注 Optional（选填）。
- Arm（测量手臂），标注 Optional（选填）。
- Notes（备注），标注 Optional（选填）。

关键交互：

- 输入或选择字段。
- 点击 Save Reading（保存记录）。

规则 / 异常：

- SYS / DIA 必填，Pulse 选填。
- 选填字段必须在字段名旁明确标注 Optional（选填）。
- DIA 必须小于 SYS。
- Date / Time 默认当前时间。
- 未输入 SYS / DIA 时，底部参考范围区域显示 `Enter SYS and DIA to see reference status.（输入收缩压和舒张压后查看参考状态。）`，不显示 `Within your reference range（在参考范围内）`。
- SYS / DIA 均在默认参考范围内时，底部参考范围区域显示 `Within your reference range（在参考范围内）`。
- 超出默认参考范围但仍在可保存硬范围内时，保存前弹出二次确认；二次确认用于防误填、提醒复核，并将记录保存为对应状态标签。
- 明显异常或危险高值保存后使用 `review_recheck（建议复核）` 状态，且不触发主动好评引导。
- 保存成功后进入 Add Success（添加成功页），回显本次保存数据并推荐 AI 解读、趋势和返回首页。

字段规则：

| 字段 | 是否必填 | 类型 | 默认值 / 枚举 |
|---|---|---|---|
| Systolic（收缩压） | 必填 | number | 建议范围 50-250 |
| Diastolic（舒张压） | 必填 | number | 建议范围 30-160 |
| Pulse（心率） | 选填 | number | 建议范围 30-220 |
| Date（日期） | 必填 | date | 当前日期 |
| Time（时间） | 必填 | time | 当前时间 |
| Measurement Time（测量时段） | 选填 | enum | Morning（早晨） / Afternoon（下午） / Evening（晚上） / Night（夜间） |
| Body Status（身体状态） | 选填 | enum | Resting（静息） / After Exercise（运动后） / After Meal（饭后） / Stressed（压力状态） |
| Arm（测量手臂） | 选填 | enum | Left Arm（左臂） / Right Arm（右臂） |
| Notes（备注） | 选填 | text | 最多 300 字符 |

页面文案：

```text
Please enter a valid number.
This field is required.
Diastolic pressure should be lower than systolic pressure.
This value looks unusual. Please check it before saving.
This reading is outside the default reference range. Please review the value before saving.
Enter SYS and DIA to see reference status.
Within your reference range.
Reading saved.

请输入有效数字。
此项为必填。
舒张压应低于收缩压。
这个数值看起来异常，请保存前确认。
该记录超出默认参考范围，请保存前复核数值。
输入收缩压和舒张压后查看参考状态。
在参考范围内。
记录已保存。
```

### 5.8.1 Add Success（添加成功页）

页面归属：Add Reading（手动添加记录页）和 OCR Confirm Result（识别结果确认页）的保存结果页。

页面目标：明确告诉用户保存成功，回显本次数据，并推荐下一步功能。

展示内容：

- Saved（已保存）状态。
- 本次血压：SYS / DIA。
- Pulse（心率），仅在用户填写或 OCR 识别到心率时展示。
- Measurement Time（测量时间）。
- Source（来源）：Manual Entry（手动输入）/ OCR Scan（OCR 扫描）。
- 状态标签：In range（范围内）/ Above range（偏高）/ Below range（偏低）/ High reading（明显偏高）/ Recheck（建议复核）。
- Generate Insight（生成解读）。
- View Trends（查看趋势）。
- Back Home（返回首页）。

关键交互：

- 点击 Generate Insight（生成解读）：带本次记录进入 AI Insight（AI 解读页）。
- 点击 View Trends（查看趋势）：进入 Trends（趋势页）。
- 点击 Back Home（返回首页）：返回 Home（首页）。

规则 / 异常：

- 保存成功页只展示本次保存结果，不替代 PDF Report（PDF 报告页）。
- 用户填写的选填项在成功页展示；未填写的选填项隐藏，不显示空字段。
- 从 OCR 保存且未识别到 Pulse（心率）时，成功页不展示 Pulse 字段。
- PDF Report（PDF 报告）和 AI Insight（AI 解读）中遇到选填项缺失时按场景处理：关键明细可显示 Not recorded（未记录）/ Pulse not recorded（心率未记录），非关键补充项可隐藏。
- 状态标签只基于参考范围和数值阈值做健康参考，不输出诊断。

### 5.9 OCR Scan（血压计识别页）

页面归属：Add（添加）下的二级功能页。

页面目标：通过相机识别实体血压计屏幕上的 SYS / DIA / Pulse。

展示内容：

- 相机取景。
- 扫描框。
- 闪光灯开关。
- 拍摄按钮。
- Enter Manually（手动输入）。

关键交互：

- 拍摄血压计屏幕。
- OCR 成功后进入 OCR Confirm Result（识别结果确认页）。
- OCR 失败时支持 Retake（重新拍摄）和 Enter Manually（手动输入）。

规则 / 异常：

- 需要 Camera（相机）权限。
- OCR 结果不能直接保存，必须让用户确认。

页面文案：

```text
Scan BP Monitor
Point your camera at the BP monitor screen.
Make sure the numbers are clear and visible.
We couldn't read the numbers clearly. Please retake the photo or enter the reading manually.

扫描血压计
将相机对准血压计屏幕。
确保数字清晰可见。
未能清晰识别数字，请重新拍摄或手动输入。
```

### 5.10 OCR Confirm Result（识别结果确认页）

页面归属：OCR Scan（血压计识别）结果页。

页面目标：让用户确认或修改 OCR 识别结果，避免错误数据直接保存。

展示内容：

- SYS（收缩压）。
- DIA（舒张压）。
- Pulse（心率），未识别到时留空并标注 Optional（选填）。
- Edit Manually（手动修改）。
- Save Reading（保存记录）。
- Retake（重新拍摄）。

关键交互：

- 用户可修改识别结果。
- 点击 Save Reading（保存记录）后保存到 History（历史记录），source = ocr。
- 点击 Retake（重新拍摄）返回 OCR Scan（血压计识别页）。

规则 / 异常：

- 保存前复用 Add Reading（手动添加记录页）的校验规则。
- 如果识别到 SYS / DIA，但没有识别到 Pulse（心率），允许保存。
- 如果 SYS 或 DIA 缺失，必须要求用户补全后才能保存。
- Pulse 未记录时，Add Success（添加成功页）、PDF Report（PDF 报告）和 AI Insight（AI 解读）按 Pulse not recorded（心率未记录）处理。

### 5.11 History（历史页）

页面归属：一级 Tab。

页面目标：展示血压记录和独立心率记录，并支持筛选、查看、编辑和删除。

展示内容：

- 记录列表，包含血压记录和独立心率记录。
- 筛选标签：All（全部）、Manual Entry（手动输入）、OCR Scan（血压计识别）、Heart Rate（心率）。
- 空状态。

关键交互：

- 点击记录进入 Record Detail（记录详情页）。
- 筛选不同来源和记录类型。
- 编辑或删除记录。

规则 / 异常：

- 默认按时间倒序。
- 无记录时展示空状态和 Add Blood Pressure（添加血压）入口。
- 独立心率记录展示 Pulse（心率）、Time（时间）和 Source（来源）；不展示 SYS / DIA，不展示血压参考范围状态。
- 删除前必须二次确认。

页面文案：

```text
Today 08:30 AM
Pulse 76 bpm
Manual Entry
Heart Rate
Camera heart rate
Delete this reading?
This action cannot be undone.

今天 08:30
心率 76
手动输入
心率
相机心率
删除这条记录？
此操作无法撤销。
```

### 5.12 Record Detail（记录详情页）

页面归属：History（历史）下的二级详情页。

页面目标：展示单条记录完整信息，并支持编辑和删除。

展示内容：

- 血压记录：SYS（收缩压）、DIA（舒张压）、Pulse（心率，如有）、时间、来源、标签、备注、状态。
- 心率记录：Pulse（心率）、Time（时间）、Source（来源）、健康参考说明。

关键交互：

- Edit（编辑）：进入 Add Reading（手动添加记录页）的编辑态。
- Delete（删除）：二次确认后删除并返回 History（历史页）。

规则 / 异常：

- 编辑保存后刷新 History（历史页）和 Home（首页）最新记录。
- 心率记录详情不提供 Add Reading 编辑态；如需修改，用户可删除后重新检测或重新录入血压记录中的 Pulse（心率）。
- 心率记录详情不展示 SYS / DIA 和血压参考范围状态。

### 5.13 Trends（趋势页）

页面归属：一级 Tab。

页面目标：帮助用户查看 7 日 / 30 日血压趋势和统计。

展示内容：

- 7 Days（7 日） / 30 Days（30 日）切换。
- SYS / DIA 主折线图。
- Average BP（平均血压）。
- Average Pulse（平均心率），仅周期内存在心率数据时作为辅助统计展示。
- Highest BP（最高血压）。
- Lowest BP（最低血压）。
- Total Records（记录总数）。
- Trend Status（趋势状态）。
- AI Insight（AI 解读）入口。
- PDF Report（PDF 报告）入口。

关键交互：

- 切换 7 日 / 30 日周期。
- 点击 Generate Insight（生成解读）进入 AI Insight（AI 解读页），默认上下文为当前周期。
- 点击 Export Report（导出报告）进入 PDF Report（PDF 报告页），默认上下文为当前周期。

规则 / 异常：

- 至少 2 条记录展示趋势图。
- 数据不足时展示空状态，不输出趋势判断。
- 30 Days（30 日）横轴不展示 30 个日期点，只展示 4-6 个日期刻度，例如 6/1、6/8、6/15、6/22、6/30。
- 默认主图只展示 SYS / DIA；Pulse（心率）不作为主趋势线。
- 周期内没有心率数据时，不展示 Average Pulse（平均心率）。
- 底部展示健康参考说明。

页面文案：

```text
Not enough data
Average Pulse
Trends are for wellness reference only and do not replace medical advice.

数据不足
平均心率
趋势仅作健康参考，不能替代医疗建议。
```

### 5.14 AI Insight（AI 解读页）

页面归属：Home（首页）、Trends（趋势）、Heart Rate Result（心率检测结果页）、PDF Report（PDF 报告页）下的二级功能页。

页面目标：基于用户血压记录和心率记录生成健康参考型解读，提升用户对记录和趋势的理解。

展示内容：

- This Reading（本次记录） / 7 Days（7 日） / 30 Days（30 日）切换。
- 当前上下文为心率记录时，This Reading（本次记录）展示心率解读；当前上下文为血压记录时，展示血压解读并可包含 Pulse（心率）辅助信息。
- 输入数据摘要卡片：本次记录或当前周期统计，不使用传统表格样式。
- Generate Insight（生成解读）按钮。
- 生成中 loading。
- AI Summary（AI 总结）。
- Possible Factors（可能因素）。
- Suggestions（建议）。
- Regenerate Insight（重新生成解读）。
- Report Issue（反馈问题）。
- 底部免责声明。

关键交互：

- 从 Add Success（添加成功页）进入时，默认选中 This Reading（本次记录），并带入刚保存的数据。
- 从 Heart Rate Result（心率检测结果页）进入时，默认选中 This Reading（本次记录），带入心率数据并生成心率解读。
- 从 Trends（趋势页）进入时，默认选中当前趋势周期。
- 从 Home（首页）进入时，默认选中 7 Days（7 日）。
- 用户可手动切换 This Reading（本次记录） / 7 Days（7 日） / 30 Days（30 日）。
- 点击 Generate Insight（生成解读）后进入生成中状态。
- 生成成功后展示 AI Summary（AI 总结）、Possible Factors（可能因素）、Suggestions（建议）。
- 生成失败时展示重试入口。
- 点击 Report Issue（反馈问题）打开 AI 内容反馈弹窗。

规则 / 异常：

- This Reading（本次记录）：至少 1 条记录。
- 7 Days（7 日）：至少 3 条记录。
- 30 Days（30 日）：至少 5 条记录。
- 数据不足时提示继续记录。
- AI 解读支持两类上下文：Blood Pressure Insight（血压解读）和 Heart Rate Insight（心率解读）。
- Blood Pressure Insight（血压解读）完整支持 This Reading（本次记录）/ 7 Days（7 日）/ 30 Days（30 日），以 SYS / DIA 为主，Pulse（心率）作为辅助信息。
- Heart Rate Insight（心率解读）支持 This Reading（本次心率）和周期内心率概览；当没有血压记录但有心率记录时，可以生成心率解读，但不得输出血压趋势、血压状态或血压建议。
- 同一条血压记录内的 Pulse 可直接参与血压解读；同日相机心率在血压解读中标注为 Same-day heart rate reference（同日心率参考）。
- 只有心率、没有血压记录时，AI 页面展示 Heart Rate Insight（心率解读），并在底部保留 Add Blood Pressure（添加血压）引导。
- Pulse 未填写或未识别时，按 Pulse not recorded（心率未记录）展示。
- 心率解读必须标注 Camera-based heart rate is for wellness reference only.（相机心率仅作健康参考。）
- AI 不输出诊断、治疗、用药建议或疾病风险判断。
- AI 内容反馈用于收集生成内容问题，不收集病史、手机号、真实身份等敏感信息。

AI 输入摘要卡片行：

| 行 | 规则 |
|---|---|
| Insight Type（解读类型） | Blood Pressure Insight（血压解读）/ Heart Rate Insight（心率解读） |
| SYS / DIA | 血压上下文必须展示；心率上下文不展示 |
| Pulse（心率） | 心率上下文必须展示；血压上下文有值展示，无值展示 Pulse not recorded（心率未记录）或隐藏，按场景定 |
| Time（时间） | 展示记录时间或周期 |
| Source（来源） | Manual Entry（手动输入）/ OCR Scan（OCR 扫描）/ Camera heart rate（相机心率） |
| Reference Status（参考范围状态） | 仅血压上下文展示 In range / Above range / Below range / High reading / Recheck；心率上下文不展示血压参考范围状态 |

AI 内容模块：

| 模块 | 说明 |
|---|---|
| AI Summary（AI 总结） | 按上下文总结血压记录 / 心率记录 / 周期记录 |
| Possible Factors（可能因素） | 仅给通用生活方式因素，不判断真实病因 |
| Suggestions（建议） | 仅给通用健康习惯建议，不给诊断、治疗或用药建议 |

AI 反馈弹窗：

| 项 | 规则 |
|---|---|
| 入口 | AI Insight 页面底部 Report Issue（反馈问题） |
| 标题 | What was wrong with this insight?（这次解读有什么问题？） |
| 原因 | Inaccurate（不准确）/ Unsafe medical advice（不安全医疗建议）/ Not relevant（不相关）/ Hard to understand（难理解）/ Other（其他） |
| 输入框 | Add details（补充说明），选填，最多 300 字符 |
| 敏感信息提示 | 不填写手机号、病史、身份信息等敏感内容 |
| 提交后 | Thanks for your feedback.（感谢反馈） |

页面文案：

```text
Generate Insight
Generating your insight...
Not enough readings yet.
Save more records to generate a better insight.
Pulse not recorded.
Heart Rate Insight
Only heart rate data is available. This insight is based on your heart rate record.
Add a blood pressure reading for a BP insight.
Camera-based heart rate is for wellness reference only.
AI insights are for wellness reference only and do not replace medical advice.
Report Issue
Do not include phone numbers, medical history, identity information, or other sensitive details.

生成解读
正在生成你的解读。
记录数量还不够。
保存更多记录后可生成更完整的解读。
心率未记录。
心率解读
当前只有心率数据，本次解读基于你的心率记录。
添加血压记录后可生成血压解读。
相机心率仅作健康参考。
AI 解读仅作健康参考，不能替代医疗建议。
反馈问题
请不要填写手机号、病史、身份信息或其他敏感内容。
```

### 5.15 PDF Report（PDF 报告页）

页面归属：Home（首页）、Trends（趋势）、AI Insight（AI 解读）下的二级功能页。

页面目标：先展示 7 日 / 30 日血压报告预览，再支持导出 PDF 和系统分享。

展示内容：

- 7-Day Report（7 日报告） / 30-Day Report（30 日报告）。
- Summary（摘要）。
- Trend Overview（趋势概览）。
- Statistics（统计）。
- Daily Details（每日明细）。
- AI Summary（AI 总结）。
- Export PDF（导出 PDF）。
- Share（分享）。

关键交互：

- 切换 7 日 / 30 日报告。
- 点击 Export PDF（导出 PDF）基于当前报告预览生成 PDF。
- 生成成功后调用 iOS 系统分享面板。

规则 / 异常：

- 报告基于本地记录生成。
- 数据不足时提示继续记录。
- PDF Report（PDF 报告页）保持二级报告预览页；Export PDF（导出 PDF）和 Share（分享）是页面内动作，不新增三级页面。
- 导出 PDF 时必须包含每日数值明细。
- 每日明细包含 Date（日期）、SYS、DIA、Pulse（如有）、Status（状态标签）、Source（来源）。
- Pulse 缺失时，每日明细可显示 Not recorded（未记录）；页面摘要卡可隐藏 Average Pulse（平均心率）。
- PDF 底部必须包含免责声明。
- PDF 生成失败时提示重试。
- PDF Report（PDF 报告页）是报告预览页，Home / Trends / AI 的 PDF 入口均先进入该页面，不直接导出。

报告内容：

| 字段 | 说明 |
|---|---|
| Period（周期） | 报告覆盖时间 |
| Generated Time（生成时间） | 报告生成时间 |
| Average BP（平均血压） | 周期内平均 SYS / DIA |
| Average Pulse（平均心率） | 周期内存在 Pulse 时展示平均 Pulse；无心率数据时隐藏 |
| Highest BP（最高血压） | 周期内最高记录 |
| Lowest BP（最低血压） | 周期内最低记录 |
| Total Records（记录总数） | 周期内记录次数 |
| Trend Overview（趋势概览） | SYS / DIA 主趋势图 |
| Daily Details（每日明细） | 日期、SYS、DIA、Pulse 如有、状态标签、来源 |
| AI Summary（AI 总结） | 合规范围内的记录总结 |

页面文案：

```text
Export Report
Export your blood pressure report as a PDF file for sharing or saving.
Daily Details
Not recorded

导出报告
将你的血压报告导出为 PDF，用于分享或保存。
每日明细
未记录
```

### 5.16 Reminder Settings（提醒设置页）

页面归属：Home（首页）Reminder 卡片 / Profile（设置）下的二级设置页。

页面目标：帮助用户设置记录提醒。

展示内容：

- Daily Reminder（每日提醒）。
- Morning Reminder（早晨提醒）。
- Evening Reminder（晚上提醒）。
- Custom Reminder（自定义提醒）。
- Repeat（重复）。
- Notification Title（通知标题）。
- Notification Body（通知正文）。
- FCM Scheduled Notification（FCM 定时通知）配置状态说明。

关键交互：

- 开启或关闭提醒。
- 选择提醒时间。
- 保存提醒设置。

规则 / 异常：

- 开启本地 Reminder（本地提醒）时，如果用户尚未授权 Notification（通知）权限，则请求通知权限。
- 权限拒绝时提示去系统设置开启。
- 保存提醒后，到达用户设置的时间点时发送本地通知。
- 当 `notification_permission_retry_on_reminder = true` 且启动页 / 首页未完成授权时，用户进入 Reminder Settings（提醒设置页）并开启提醒时再触发一次通知授权流程。
- 如果系统权限状态为 denied（已拒绝），Reminder Settings 不再重复拉起系统授权弹窗，只展示 Open Settings（打开设置）入口。
- 当 `fcm_scheduled_notification_enabled = true` 时，允许服务端 / 中台按配置下发 FCM 定时通知；FCM 定时通知与用户本地 Reminder（本地提醒）并存，不能互相覆盖。
- 点击通知后进入 Home（首页），并突出 Add Blood Pressure（添加血压）入口。

页面文案：

```text
Notification Title
Time to check your blood pressure

Notification Body
Time to update your blood pressure log.
Open Settings
Notifications are used only for reminders and health record prompts.

通知标题
该记录血压了

通知正文
该更新你的血压记录了。
打开设置
通知仅用于提醒和健康记录提示。
```

### 5.17 Reference Range（参考范围页）

页面归属：Profile（设置）下的二级设置页。

页面目标：展示 V1 默认血压参考范围和状态说明，用于状态标签、趋势判断、AI 解读和 PDF 报告中的参考说明；该范围只用于 App 内健康参考，不用于医疗诊断。

展示内容：

- Default Range（默认范围）。
- Systolic（收缩压）范围。
- Diastolic（舒张压）范围。
- 状态标签说明：In range（范围内）/ Above range（偏高）/ Below range（偏低）/ High reading（明显偏高）/ Recheck（建议复核）。
- 参考范围说明卡片，解释阈值和非诊断边界。
- 参考链接：American Heart Association - Understanding Blood Pressure Readings（美国心脏协会：了解血压读数）。

关键交互：

- 点击状态标签或说明卡片时展示解释。
- 返回 Profile（设置页）。

规则 / 异常：

- 默认范围：Systolic 90-120 mmHg，Diastolic 60-80 mmHg。
- V1 不开放用户修改参考范围。
- 参考范围用于判断 In range（范围内）、Above range（偏高）、Below range（偏低）、High reading（明显偏高）、Recheck（建议复核）。
- AI Insight（AI 解读）和 PDF Report（PDF 报告）只能基于参考范围做记录解释，不得输出诊断或治疗建议。
- 默认参考范围参考链接：https://www.heart.org/en/health-topics/high-blood-pressure/understanding-blood-pressure-readings
- App 内范围只用于 wellness reference（健康参考），不是 medical diagnosis criteria（医疗诊断标准）。

页面文案：

```text
Your readings are compared against the default reference range for reference only.
Reference ranges are not medical diagnosis criteria.
Tap a status to learn what it means.
Reference: American Heart Association - Understanding Blood Pressure Readings.

你的记录会和默认参考范围对比，仅作参考。
参考范围不是医疗诊断标准。
点击状态了解含义。
参考：美国心脏协会 - 了解血压读数。
```

### 5.18 Profile（设置页）

页面归属：一级 Tab。

页面目标：集中承接快捷功能、设置、法务、反馈和同开发者应用推荐入口。

展示内容：

- 顶部快捷入口：Heart（心率）、Scan（扫描）、AI（AI）、PDF（报告）。
- Reference Range（参考范围）。
- Reminder（提醒）。
- Privacy Policy（隐私政策）。
- Terms of Use（服务条款）。
- Medical Disclaimer（医疗免责声明）。
- Feedback（反馈）。
- Rate Us（评分）。
- More from this developer（同开发者应用推荐）占位卡片区域。

关键交互：

- 点击对应入口进入二级页面或系统能力。
- 点击 Heart（心率）：进入 Heart Rate Check（相机心率检测页）。
- 点击 Scan（扫描）：进入 OCR Scan（血压计识别页）。
- 点击 AI（AI）：进入 AI Insight（AI 解读页）。
- 点击 PDF（报告）：进入 PDF Report（PDF 报告页）。

规则 / 异常：

- 法务链接必须使用真实 URL。
- 未配置真实 URL 时，不展示对应外链入口或展示本地文本页。
- More from this developer（同开发者应用推荐）先展示 2-3 个占位卡片，不写真实 App 名。
- 每张推荐卡片包含 icon 占位、App name 占位、短描述、Open/View 按钮。
- 真实 App 名、图标和跳转链接以后由上架素材替换。
- `Rate Us（评分）` 入口在 Profile（设置页）常驻，用户主动点击时调用系统评分或 App Store 评分入口。
- 当 `rating_prompt_enabled = true` 时，V1 允许出现一次主动好评引导，触发条件为用户首次成功完成任一核心功能：Add Blood Pressure（添加血压）保存成功、OCR 保存血压成功、Heart Rate Check（心率检测）成功并保存、AI Insight（AI 解读）生成成功、PDF Report（PDF 报告）导出成功。
- 当 `rating_prompt_enabled = false` 时，不展示主动好评引导；Profile（设置页）的 `Rate Us（评分）` 常驻入口不受该参数影响。
- 主动好评引导优先展示 UI 设计后的好评弹窗；用户点击 `Rate Us（去评分）` 后再调用 iOS 系统评分能力或 App Store 评分入口。
- 若本次核心功能完成后需要展示 Interstitial Ad（插屏广告）或 App Open Ad（开屏广告），则先展示广告；广告展示完成并关闭后延迟 1 秒展示好评弹窗。
- 当前正在展示系统权限弹窗、系统分享面板或广告时，不叠加展示好评弹窗；待系统弹窗或广告关闭后再按规则判断。
- 以下场景不弹主动好评引导：首次启动、Onboarding（新手引导）、Medical Disclaimer（医疗免责声明）、功能失败、用户取消流程、权限拒绝、删除记录后、异常值二次确认后保存、AI 数据不足、PDF 生成失败、AI 反馈后、最近一次记录触发 Recheck（建议复核）状态时。
- 主动好评引导频控：同一 App 版本最多触发 1 次；用户关闭或点击 `Maybe Later（稍后再说）` 后，本版本不再主动触发；用户从 Profile 主动点击 `Rate Us（评分）` 不受该频控限制。

页面文案：

```text
Enjoying ArtaBP?
Would you mind rating us on the App Store?
Rate Us
Maybe Later

喜欢 ArtaBP 吗？
可以在 App Store 给我们评分吗？
去评分
稍后再说

More from this developer
App name
A useful everyday health tool.
Open
View

同开发者应用推荐
App 名称
实用的日常健康工具。
打开
查看
```

## 6. 通用规则

### 6.1 中台自定义参数

中台自定义参数只定义 App 读取后的行为口径；V1.0.0 PRD 不实现真实后台。

| 参数 | 类型 / 取值 | 默认值 | 作用 |
|---|---|---|---|
| onboarding_enabled | boolean | true | 控制首次用户是否展示 Onboarding（新手引导） |
| rating_prompt_enabled | boolean | true | 控制是否展示主动好评引导 |
| notification_permission_surface | enum: splash / home | home | 控制 Notification（通知）权限优先在 Splash（启动页）还是 Home（首页）触发 |
| notification_permission_retry_on_reminder | boolean | true | 若启动页 / 首页未授权，进入 Reminder Settings（提醒设置页）开启提醒时再触发一次授权流程 |
| fcm_scheduled_notification_enabled | boolean | false | 控制定时 FCM 通知能力；与本地 Reminder（本地提醒）分开处理 |

参数规则：

- 参数拉取在 Splash（启动页）完成；拉取失败时使用本地默认值，并在进入后续流程后后台重试。
- 系统权限弹窗、广告、系统分享面板、相机权限和好评弹窗不得叠加展示。
- 如果 `notification_permission_surface = splash`，通知授权优先在 Splash 配置完成后触发；如果 `notification_permission_surface = home`，通知授权优先在 Home 首次曝光后触发。
- 如果用户在 Splash / Home 未授权或跳过授权，且 `notification_permission_retry_on_reminder = true`，进入 Reminder Settings 并开启提醒时再处理通知授权。
- 如果系统权限已拒绝，后续只展示 Open Settings（打开设置），不重复拉起系统授权弹窗。
- FCM 定时通知由服务端 / 中台按配置下发，本地 Reminder 由用户本机设置触发，两者都点击后进入 Home（首页）并突出 Add Blood Pressure（添加血压）入口。

### 6.2 数据状态

| 状态 | 规则 |
|---|---|
| 无血压记录且无心率记录 | Home 的 Latest Reading 和 7-Day Average 区域展示空状态，不展示数值、参考范围标签或趋势图；主引导为 Add Blood Pressure（添加血压），Heart（心率）和 Scan（扫描）快捷入口保留 |
| 无血压记录但有心率记录 | Home 仍按无血压记录处理，不把心率记录作为 Latest Reading（最新血压记录）；心率只作为辅助健康参考 |
| 有记录 | Home 展示最新记录；History 按时间倒序；Trends 按周期统计 |
| 数据不足 | Trends 展示 Not enough data，不输出趋势判断 |

### 6.3 血压状态标签

| 状态 | UI 短文案 | 说明文案 | 规则 |
|---|---|---|---|
| within_range | In range（范围内） | 数值在默认参考范围内 | SYS / DIA 均在参考范围内 |
| above_range | Above range（偏高） | 数值略高于参考范围 | SYS 或 DIA 高于参考范围，且未达到明显偏高 |
| below_range | Below range（偏低） | 数值低于参考范围 | SYS 或 DIA 低于参考范围 |
| significantly_above_range | High reading（明显偏高） | 数值明显高于参考范围 | SYS >= 140 或 DIA >= 90 |
| review_recheck | Recheck（建议复核） | 建议重新测量确认 | SYS > 180 或 DIA > 120，或录入值触发异常校验 |
| no_reference | First reading（首条记录） | 已保存为首条记录 | 首条记录或参考范围未初始化 |

默认参考阈值：

| 区间 | 规则 |
|---|---|
| below_range | SYS < 90 或 DIA < 60 |
| within_range | SYS 90-119 且 DIA 60-79 |
| above_range | SYS 120-139 或 DIA 80-89 |
| significantly_above_range | SYS >= 140 或 DIA >= 90 |
| review_recheck | SYS > 180 或 DIA > 120 |

### 6.4 健康合规边界

| 规则 | 说明 |
|---|---|
| 不做医疗诊断 | 不出现 “You have hypertension.” 等诊断表述 |
| 不做治疗建议 | 不推荐药物、剂量、治疗方案 |
| 不替代医生 | 所有趋势和记录均为健康参考 |
| 异常值提示克制 | 提醒用户复核数据，必要时咨询医生 |
| 相机检测表述受控 | 可表达为 camera-based heart rate check（相机心率检测）或 wellness reference（健康参考），不得表达为 medical-grade measurement（医疗级测量） |
| AI 解读受控 | AI Insight（AI 解读）只总结记录和通用习惯，不输出诊断、治疗、用药或疾病风险判断 |

异常值提示文案：

```text
This reading is outside the default reference range. Please review the value and consult a healthcare professional if you have concerns.

该记录超出默认参考范围。请复核数值，如有疑虑请咨询医疗专业人士。
```

### 6.5 本地存储

| 数据 | 规则 |
|---|---|
| 血压记录 | 本地保存 |
| 心率记录 | 本地保存 |
| 免责声明确认 | 本地保存 |
| 提醒设置 | 本地保存 |
| 通知权限偏好 | 仅保存 App 内请求节奏和用户操作状态；系统授权状态以 iOS 系统为准 |
| 参考范围 | 使用 V1 默认范围，不保存用户修改范围 |
| 用户备注 | 本地保存 |

补充规则：

- V1 无账号、无云同步、无 iCloud 恢复。
- 用户卸载 App 后，本地血压记录、心率记录、提醒设置、备注和免责声明确认状态会被删除。
- 用户重装 App 后不会自动恢复历史记录。
- `disclaimer_agreed = true` 表示用户点击 `I Understand（我已理解）` 后，本地保存“已同意免责声明”标记；后续启动不再强制展示首次免责声明。

### 6.6 权限

| 权限 | 用途 | 触发时机 |
|---|---|---|
| Notification | 本地提醒、FCM 定时通知提示 | 按 `notification_permission_surface` 在 Splash / Home 触发；未授权时进入 Reminder Settings 开启提醒可再触发一次 |
| Camera | 相机心率检测、OCR 扫描血压计 | 用户点击 Start Check 或 Scan BP Monitor 时 |
| System Share | 分享 PDF 报告 | 用户主动点击 Share 或导出 PDF 后 |

通知权限文案：

```text
ArtaBP sends reminders to help you keep your blood pressure log updated.

ArtaBP 会发送提醒，帮助你保持血压记录更新。
```

相机权限文案：

```text
ArtaBP uses the camera to support camera-based heart rate checks and BP monitor scanning.

ArtaBP 使用相机支持相机心率检测和血压计扫描。
```

### 6.7 埋点

| 事件名 | 触发时机 | 关键参数 |
|---|---|---|
| ob_start | 首次进入 OB | app_version |
| ob_page_view | OB 页面曝光 | page_index |
| ob_skip_by_config | 中台关闭 OB 后跳过新手引导 | onboarding_enabled |
| disclaimer_view | 免责声明曝光 | source |
| disclaimer_agree | 点击 I Understand | app_version |
| config_fetch | 启动页拉取中台配置完成 | status, fallback_used |
| notification_permission_request | 请求通知权限 | surface, permission_status |
| notification_permission_result | 通知权限请求结果 | surface, permission_status |
| fcm_scheduled_notification_receive | 收到 FCM 定时通知 | notification_id, source |
| home_view | 首页曝光 | has_reading, has_heart_rate_record |
| add_bp_click | 点击 Add Blood Pressure | source |
| heart_rate_check_view | 相机心率检测页曝光 | state, source |
| heart_rate_check_start | 开始心率检测 | source |
| heart_rate_check_cancel | 取消心率检测 | progress |
| heart_rate_check_success | 心率检测成功 | duration |
| heart_rate_check_fail | 心率检测失败 | fail_reason |
| heart_rate_result_view | 心率结果页曝光 | status |
| heart_rate_auto_save | 心率检测成功后自动保存为参考记录 | status |
| heart_rate_retake | 点击重测 | fail_reason |
| add_reading_click | 点击 Add Blood Pressure | source |
| manual_add_view | 进入添加页 | mode: create/edit |
| manual_record_save | 保存记录成功 | source, status |
| manual_record_fail | 保存失败 | fail_reason |
| manual_abnormal_confirm_view | 异常值保存前二次确认曝光 | status |
| manual_abnormal_confirm_save | 异常值二次确认后保存 | status |
| ocr_scan_start | 进入 OCR 扫描 | source |
| ocr_scan_capture | 拍摄血压计屏幕 | camera_permission_status |
| ocr_scan_success | OCR 识别成功 | recognized_fields |
| ocr_scan_fail | OCR 识别失败 | fail_reason |
| ocr_result_edit | 用户修改 OCR 结果 | edited_fields |
| ocr_record_save | 保存 OCR 记录 | status |
| history_view | 历史页曝光 | record_count |
| history_filter_click | 点击筛选 | filter_type |
| record_detail_view | 记录详情曝光 | source |
| record_edit | 编辑记录 | source |
| record_delete | 删除记录 | source |
| trends_view | 趋势页曝光 | period, record_count |
| trends_period_click | 切换趋势周期 | period |
| ai_insight_view | AI 解读页曝光 | insight_type, record_count |
| ai_insight_generate | 生成 AI 解读 | insight_type |
| ai_insight_success | AI 解读成功 | insight_type |
| ai_insight_fail | AI 解读失败 | fail_reason |
| ai_insight_feedback_open | 打开 AI 反馈弹窗 | insight_type |
| ai_insight_feedback_submit | 提交 AI 反馈 | reason |
| report_view | 报告页曝光 | report_type, record_count |
| report_generate | 生成报告 | report_type |
| pdf_export_click | 点击导出 PDF | report_type |
| pdf_export_success | PDF 导出成功 | report_type |
| pdf_export_fail | PDF 导出失败 | fail_reason |
| report_share | 分享报告 | report_type |
| reminder_view | 提醒设置页曝光 | reminder_enabled |
| reminder_save | 保存提醒设置 | reminder_enabled |
| reference_range_view | 参考范围页曝光 | app_version |
| profile_view | 设置页曝光 | app_version |
| rating_prompt_view | 主动好评引导曝光 | trigger |
| rating_prompt_click | 点击主动好评引导按钮 | action |

### 6.8 数据字段

血压记录：

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 记录 ID |
| source | enum | manual / ocr |
| systolic | number | 收缩压 |
| diastolic | number | 舒张压 |
| pulse | number? | 心率，选填 |
| date_time | datetime | 测量时间 |
| measurement_time | enum | Morning / Afternoon / Evening / Night |
| body_status | enum | Resting / After Exercise / After Meal / Stressed |
| arm | enum | Left Arm / Right Arm |
| note | string | 用户备注 |
| status | enum | within_range / above_range / below_range / significantly_above_range / review_recheck / no_reference |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |

心率记录：

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 记录 ID |
| source | enum | camera_heart_rate |
| pulse | number | 心率 |
| date_time | datetime | 测量时间 |
| created_at | datetime | 创建时间 |

中台配置：

| 字段 | 类型 | 说明 |
|---|---|---|
| onboarding_enabled | boolean | 是否展示 Onboarding（新手引导） |
| rating_prompt_enabled | boolean | 是否展示主动好评引导 |
| notification_permission_surface | enum | splash / home |
| notification_permission_retry_on_reminder | boolean | 是否在 Reminder Settings 再处理通知授权 |
| fcm_scheduled_notification_enabled | boolean | 是否启用定时 FCM 通知 |
| config_updated_at | datetime | 配置更新时间 |

通知记录：

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 通知 ID |
| type | enum | local_reminder / fcm_scheduled |
| title | string | 通知标题 |
| body | string | 通知正文 |
| scheduled_time | datetime | 计划触发时间 |
| delivered_at | datetime? | 实际送达时间 |
| opened | boolean | 用户是否点击通知 |

AI 解读记录：

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 解读 ID |
| type | enum | bp_single / heart_rate_single / bp_7_day / bp_30_day / heart_rate_period |
| record_ids | array | 关联记录 |
| summary | string | AI 总结 |
| factors | array | 可能因素 |
| suggestions | array | 通用建议 |
| created_at | datetime | 创建时间 |

PDF 报告记录：

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 报告 ID |
| type | enum | 7_day / 30_day |
| period_start | datetime | 开始时间 |
| period_end | datetime | 结束时间 |
| file_path | string | PDF 文件路径 |
| generated_at | datetime | 生成时间 |
| shared | boolean | 是否分享 |

用户设置：

| 字段 | 类型 | 说明 |
|---|---|---|
| disclaimer_agreed | boolean | 是否同意免责声明 |
| reminder_enabled | boolean | 是否开启提醒 |
| morning_reminder_time | time | 早晨提醒 |
| evening_reminder_time | time | 晚间提醒 |
| custom_reminder_time | time | 自定义提醒 |
| notification_permission_last_surface | enum? | 最近一次请求通知权限的位置 |
| notification_permission_last_status | enum? | not_determined / authorized / denied / provisional |
| reference_range_version | string | 默认参考范围版本 |

## 7. 验收标准

| 模块 | 验收标准 |
|---|---|
| Splash | 展示 Logo 动效、产品名称、Slogan、进度条；配置拉取成功或失败都继续进入后续流程；配置失败后在后台继续重试；首次用户按 `onboarding_enabled` 决定进入 OB 或直接进入免责声明；`notification_permission_surface = splash` 时可在启动页处理通知权限 |
| Onboarding | `onboarding_enabled = true` 时首次用户可完成 3 页图文引导并进入免责声明；`onboarding_enabled = false` 时跳过 OB 但不跳过免责声明；每页预留 Native Ad 广告位；广告加载失败不阻断 OB |
| Medical Disclaimer | 用户必须点击 I Understand 才能进入首页；Profile 可再次查看免责声明 |
| Home | 无记录和有记录状态展示正确；Add Blood Pressure 可进入添加血压；Heart / Scan / AI / PDF 快捷入口可进入对应页面；顶部双排文案空间不足时只保留单行主文案；`notification_permission_surface = home` 时可在首页处理通知权限 |
| Add Bottom Sheet | Add Tab 点击后弹出三种添加方式；标题、说明和 3 个入口说明文案展示完整；Add Blood Pressure、Measure Heart Rate、Scan BP Monitor 可进入对应二级页面 |
| Heart Rate Check | 用户可在同一页面完成准备态、检测态、失败态切换；检测态展示倒计时、进度环、动态波形和信号提示；检测成功后进入心率结果页；检测失败按 no_finger / too_much_movement / bad_signal / timeout 展示；检测中 Cancel 或返回会触发确认；确认取消后停止检测并回到准备态；不保存心率数据；检测中不展示广告或打断弹窗；不展示模拟失败按钮 |
| Heart Rate Result | 只展示心率结果和健康参考说明；检测成功后自动保存为心率参考记录；页面主按钮为 View AI Insight，副按钮为 Add Blood Pressure 和 Retake Test；不新增心率保存成功页；不展示底部 BP 推荐卡片；心率记录不覆盖最新血压记录 |
| Add Reading | SYS / DIA 必填、Pulse 选填、数值范围、DIA 小于 SYS 校验生效；未输入 SYS / DIA 时不显示范围内文案；异常值保存前有二次确认；明显异常保存后为 review_recheck；保存后进入 Add Success |
| Add Success | 保存成功后回显本次数据和状态标签；已填写选填项展示，未填写选填项隐藏；可进入 AI 解读、趋势或返回首页 |
| OCR Scan | 用户可拍摄血压计屏幕；识别 SYS / DIA / Pulse；可修改识别结果；SYS / DIA 识别成功但 Pulse 缺失时允许保存；保存后记录进入 History |
| History | 血压记录和独立心率记录按时间倒序展示；支持 All / Manual Entry / OCR Scan / Heart Rate 筛选；心率记录可查看和删除；空状态正确 |
| Record Detail | 血压记录展示完整信息并支持编辑和删除；心率记录只展示 Pulse、Time、Source 和健康参考说明，不展示 SYS / DIA 或血压参考范围状态 |
| Trends | 支持 7 日 / 30 日切换；默认主图展示 SYS / DIA；30 日横轴只展示 4-6 个日期刻度；Average Pulse 仅在周期内有心率数据时展示；数据不足时展示空状态 |
| AI Insight | 支持血压记录的单次、7 日、30 日解读；支持单次心率和周期心率健康参考解读；只有心率没有血压时生成 Heart Rate Insight（心率解读），不输出血压趋势或血压建议；数据摘要使用卡片行列；反馈弹窗含 300 字符限制、原因选项和敏感信息提示；不输出诊断、治疗、用药或疾病风险判断 |
| PDF Report | 先展示 7 日 / 30 日二级报告预览；导出 PDF 是页面内动作；报告包含统计、SYS / DIA 趋势、AI Summary 和每日明细；每日明细包含日期、SYS、DIA、Pulse 如有、状态标签、来源；PDF 底部包含免责声明 |
| Reminder | 开启本地提醒时按权限状态处理 Notification 授权；启动页 / 首页未授权时进入提醒页可再触发一次；系统已拒绝时展示 Open Settings；保存后按设置触发本地提醒；`fcm_scheduled_notification_enabled = true` 时可接收 FCM 定时通知；点击通知进入 Home |
| Reference Range | V1 只展示默认参考范围、状态说明、AHA 参考链接和非诊断说明；不开放修改范围；点击说明可解释阈值和非诊断边界；参考范围能用于状态标签、趋势、AI 解读和 PDF 报告的参考说明 |
| Profile | 顶部 Heart / Scan / AI / PDF 快捷入口可进入对应页面；Privacy Policy、Terms of Use、Medical Disclaimer 入口可用；底部展示 2-3 个同开发者应用推荐占位卡片；主动好评引导受 `rating_prompt_enabled` 控制，Profile 常驻评分入口不受影响 |
| 合规 | 全 App 不出现诊断、治疗、药物建议或医疗级准确测量表述；心率检测结果必须带健康参考说明 |
| 埋点 | 关键行为事件能正常上报，参数不为空 |

## 8. 后续版本预留

| 能力 | 建议版本 | 前置条件 |
|---|---|---|
| Heart Rate Check Accuracy（心率检测准确性优化） | v1.1.0+ | 基于首版检测成功率、失败原因、保存率继续优化 |
| AI Insight Prompt（AI 解读提示词优化） | v1.1.0+ | 基于用户点击率、生成成功率、合规审核继续优化 |
| OCR Accuracy（OCR 识别准确率优化） | v1.1.0+ | 基于识别成功率、用户修改字段继续优化 |
| PDF Report Template（PDF 报告模板优化） | v1.1.0+ | 基于导出率、分享率继续优化 |
| Subscription（订阅） | 待定 | 明确付费权益、价格、试用和法务链接 |
