# PRD - Pro 自定义快捷键 日期:2026-06-28 状态:需求口径已确认,待进入实现 目标版本:8.2.0 ## 1. 背景 用户希望 TagLauncher 支持自定义快捷键。项目历史上曾做过类似能力,后续两次回滚: - 3.1.13 曾新增全局快捷键设置,3.1.16 回滚。 - 7.5.0 曾新增 Quick Search 全局快捷键配置,7.5.1 回滚。 当前 App 只展示固定快捷键: - App Grid 全局唤起:`⌥⇧Space` - Quick Search 全局唤起:`Fn+Space` - App Grid 内部 `Space` 打开 Quick Search:固定内部操作 本轮新产品约束:自定义快捷键必须作为 Pro 功能。普通用户不能自定义快捷键,但默认快捷键仍必须免费可用。 ## 2. 目标 让 Pro 用户可以自定义两个全局唤起快捷键,同时保持免费用户基础体验完整。 完成标准: - 免费用户继续可使用默认 App Grid 和 Quick Search 快捷键。 - 免费用户不能录制、保存或应用自定义快捷键。 - Pro 用户可以分别自定义 App Grid 全局唤起和 Quick Search 全局唤起。 - 自定义失败时旧快捷键继续可用,不出现快捷键丢失。 - 设置页、菜单栏、注册状态、提示文案保持一致。 - 29 种语言文案完整。 - macOS 14 / 15 / 26 完成回归。 - App Store 审核材料能清楚说明免费功能、Pro 功能和旧付费用户权益。 ## 3. 不做范围 - 不自定义 App Grid 内部 `Space` 行为。 - 不把 Quick Search 基础能力变成 Pro。 - 不允许免费用户试用或预览自定义快捷键。 - 不允许通过外部授权、激活码、网站支付解锁。 - 不引入 Accessibility、Input Monitoring、CGEventTap 或私有 API。 - 首版不支持禁用某个全局快捷键。 - 首版不支持两个入口使用同一个快捷键。 - 首版不支持无修饰键、单字符键、modifier-only、Shift-only、Option-only 或明显系统保留组合。 ## 4. 用户规则 ### 4.1 免费用户 免费用户可以: - 使用默认 App Grid 快捷键 `⌥⇧Space`。 - 使用默认 Quick Search 快捷键 `Fn+Space`。 - 在设置页查看当前快捷键和注册状态。 - 点击 Pro 入口了解“自定义快捷键”属于 Pro 功能。 - 恢复购买。 免费用户不可以: - 进入真实快捷键录制状态。 - 保存自定义快捷键。 - 让自定义快捷键立即生效。 - 通过历史 defaults 或外部写入绕过 Pro 限制。 免费态下,即使本机存在历史自定义快捷键数据,有效快捷键也必须回到默认值。 ### 4.2 Pro 用户 Pro 用户可以: - 自定义 App Grid 全局唤起快捷键。 - 自定义 Quick Search 全局唤起快捷键。 - 单项恢复默认快捷键。 - 看到冲突、无效组合、注册失败提示。 - 重启后保留已保存的自定义快捷键。 Pro 用户遇到注册失败时: - 新快捷键不保存。 - 旧快捷键继续可用。 - UI 显示明确失败原因或通用冲突提示。 ### 4.3 旧付费用户 如果用户的 `originalAppVersion` 早于“免费 + Pro”的首个版本,则自动获得 Pro;必要时用 `originalPurchaseDate` 兜底。 旧付费用户自动获得 Pro 后,也自然获得自定义快捷键能力。 ## 5. 设置页交互 位置:设置 > 快捷键。 显示内容: - App Grid 全局唤起 - Quick Search 全局唤起 - App Grid 内部 `Space` 提示,仍作为固定说明展示,不提供自定义入口 - 触控板 URL 触发方式说明,保持现有逻辑 免费用户: - 两个全局快捷键行展示当前默认值。 - 自定义入口显示 Pro 标识。 - 点击自定义入口时弹出 Pro 解锁提示。 - 不进入录制态,不写入任何快捷键数据。 Pro 用户: - 点击“修改”进入录制态。 - `Esc` 取消录制。 - 录制无效组合时显示错误,不保存。 - 录制成功后即时生效。 - “恢复默认”只影响当前行。 ## 6. 有效快捷键规则 有效快捷键由用户权益决定: - 免费用户:始终使用默认快捷键。 - Pro 用户:优先使用已保存的合法自定义快捷键;没有保存值时使用默认快捷键。 - Pro 权益失效或不可用时:回退默认快捷键;历史自定义值可以保留为不可生效存档,重新获得 Pro 后再恢复生效。 ## 7. 数据规则 必须满足: - 免费用户不能写入真实自定义快捷键数据。 - 免费用户不能写入 pending、草稿、冲突状态等会被注册器误用的数据。 - 新数据结构不得被历史 `removeShortcutCustomizationDefaults()` 清理。 - 注册与保存必须事务式完成:先验证并注册候选快捷键,成功后再持久化;失败则不改旧值。 - 菜单栏、设置页、注册器必须从同一个有效快捷键来源读取。 ## 8. App Store 审核风险 ### 8.1 风险判断 本需求属于 App 内数字功能解锁,应通过 App Store In-App Purchase 的非消耗型 Pro 商品提供。这个方向与 Apple 对 App 内功能解锁使用 IAP 的要求一致。 主要风险不在“自定义快捷键作为 Pro”本身,而在以下几点: - 免费版如果不可用,可能被认为下载后基础功能不足。 - 如果使用外部支付或自有授权,会违反 IAP 规则。 - 如果为了快捷键引入 Accessibility、Input Monitoring 或键盘监听权限,会增加审核解释成本。 - 如果元数据没有解释旧付费用户自动获得 Pro,用户和审核员可能误解为重复收费。 ### 8.2 降风险口径 提交审核时必须说明: - App 现在免费下载。 - 免费用户仍可使用默认快捷键、标签整理、应用启动和基础 Quick Search。 - Pro 为一次性买断,不是订阅。 - Pro 解锁自定义快捷键等高级能力。 - 旧付费下载用户会自动获得终身 Pro,不需要再次购买。 - 自定义快捷键不需要 Accessibility、Input Monitoring 或额外隐私权限。 - 快捷键注册失败会保留旧快捷键,不影响基础使用。 ### 8.3 官方参考 - Apple App Review Guidelines:https://developer.apple.com/app-store/review/guidelines/ - App Store Connect - Configure in-app purchases:https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/overview-for-configuring-in-app-purchases/ ## 9. 多语言要求 29 种语言必须新增或校对以下文案: - 自定义快捷键 - App Grid 快捷键 - Quick Search 快捷键 - 修改 - 正在录制 - 按下新的快捷键 - 取消 - 恢复默认 - 此快捷键不可用 - 此快捷键已被占用 - 此组合不支持 - 需要 Pro - 解锁 Pro 后可自定义快捷键 - 默认快捷键仍可免费使用 快捷键符号建议统一保留 `⌘`、`⌥`、`⇧`、`⌃`,避免逐语种翻译符号本身。`Space`、`Fn` 需要本地化显示或统一符号策略。 ## 10. QA 验收用例 ### HKEY-01 免费默认可用 免费用户启动 App 后: - `⌥⇧Space` 可以打开 App Grid。 - `Fn+Space` 可以打开 Quick Search。 - 设置页显示两个默认快捷键。 ### HKEY-02 免费用户不能自定义 免费用户点击自定义入口: - 出现 Pro 解锁提示。 - 不进入真实录制态。 - 不写入自定义快捷键数据。 - 默认快捷键仍继续可用。 ### HKEY-03 Pro 用户可自定义 App Grid Pro 用户修改 App Grid 快捷键后: - 新快捷键打开 App Grid。 - 旧快捷键不再触发 App Grid。 - 设置页和菜单栏显示新快捷键。 - 重启后仍生效。 ### HKEY-04 Pro 用户可自定义 Quick Search Pro 用户修改 Quick Search 快捷键后: - 新快捷键打开 Quick Search。 - 触发后可以立即输入。 - 旧快捷键不再触发 Quick Search。 - 重启后仍生效。 ### HKEY-05 冲突失败回滚 当候选快捷键被系统或其他 App 占用: - 显示失败提示。 - 不保存候选快捷键。 - 旧快捷键继续可用。 ### HKEY-06 无效组合拒绝 以下组合不得保存: - 空快捷键 - 单普通键 - modifier-only - Shift-only - Option-only - 两个入口重复组合 - 明显系统保留组合 ### HKEY-07 恢复默认 Pro 用户点击恢复默认: - 当前行恢复到默认快捷键。 - 另一个快捷键不受影响。 - 重启后仍为默认值。 ### HKEY-08 权益状态变化 当 Pro 状态变化: - 获得 Pro 后可以自定义。 - 失去 Pro 后有效快捷键回到默认。 - 重新获得 Pro 后,可恢复之前保存的自定义值。 ### HKEY-09 历史数据清理 存在旧版本快捷键 defaults 时: - 不应误用历史不可控数据。 - 不应清理新 schema 的有效数据。 - 免费用户仍使用默认快捷键。 ### HKEY-10 多系统回归 必须覆盖: - macOS 14 真机 - macOS 15 - macOS 26 - 全屏 - Split View - 多显示器 - 隐藏 Dock - 菜单栏入口 fallback - 连续快速触发 ## 11. 提交市场前检查 - App 价格为免费。 - Pro IAP 为非消耗型一次性买断。 - App 与 IAP 状态可一并提交审核。 - Review Notes 写清楚免费功能、Pro 功能、旧用户自动 Pro 和快捷键无额外权限。 - 元数据、截图、支持页不残留“付费下载后才能用”的旧口径。 - 29 语种 Pro / 快捷键文案完整。 - TestFlight 或本地 QA 记录覆盖免费、Pro、老付费自动 Pro。 ## 12. 团队讨论结论 产品总监: - 推荐把自定义快捷键纳入同一个 Lifetime Pro Unlock。 - 免费用户保留默认快捷键,不做免费预览。 - Pro 只解锁“自定义”能力,不锁基础启动和基础 Quick Search。 架构师: - 继续走 Carbon `RegisterEventHotKey`。 - 不引入 Accessibility、Input Monitoring、CGEventTap。 - 有效快捷键必须由单一来源统一提供。 - 保存必须事务式,失败回滚。 代码审核员: - 历史回滚风险来自 OS 注册状态、持久化状态、UI 显示状态不一致。 - 必须处理历史快捷键 defaults 清理逻辑。 - Pro gating 不能只做 UI,保存和有效值读取也必须拦截。 QA: - 必须覆盖免费、Pro、老付费自动 Pro 三种状态。 - 必须覆盖 macOS 14 / 15 / 26。 - 必须补冲突失败回滚和重启持久化。 - 多语言文案必须完整校对。 ## 13. 需要用户确认的默认口径 用户已于 2026-06-28 确认以下口径全部无异议,后续实现按此执行: 1. 自定义快捷键作为现有 Lifetime Pro Unlock 的一部分,不新增单独 IAP。 2. 免费用户显示锁定入口,点击后弹 Pro 提示;不隐藏整项。 3. 首版不允许禁用某个全局快捷键。 4. 首版不允许两个入口使用同一个快捷键。 5. 首版禁止无修饰键、modifier-only、Shift-only、Option-only 和明显系统保留组合。 6. 默认快捷键继续保持 `⌥⇧Space` 和 `Fn+Space`,本需求不顺手改默认值。 7. 历史旧快捷键 defaults 不迁移为有效设置;只清理或忽略,不服务少量历史测试用户。