edit | blame | history | raw

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 后可自定义快捷键
  • 默认快捷键仍可免费使用

快捷键符号建议统一保留 ,避免逐语种翻译符号本身。SpaceFn 需要本地化显示或统一符号策略。

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. 默认快捷键继续保持 ⌥⇧SpaceFn+Space,本需求不顺手改默认值。
  7. 历史旧快捷键 defaults 不迁移为有效设置;只清理或忽略,不服务少量历史测试用户。