edit | blame | history | raw

AppStore输入法与AX路线

生成日期:2026-07-09

当前状态

最近结论摘录

  • 与 Owner 对齐:本地 QA PASS 或 AX-QA-PERMISSION PASS 不足以成为合并 main 的理由。
  • AX-10BSwaiting-owner / decision-needed 更新为 OWNER_DECISION / HOLD_MAINLINE_MERGE
  • 新增 AX-10BT 作为 AX 分支继续证明 MAS / App Store 可行性的后续规划入口。
  • 追加 02-P/进度地图.md Progress Log,记录本轮战略决策。
    1. 当前不启动本地主线合并。

核心事实补录

2026-06-11 2026-06-11-AppStore整改.md

`/Users/ar/Projects/PrivateVoice/.worktrees/appstore-2.1.28-launch-hotfix/privatevoice.src/build/macappstore-hotfix-20260611.1636/universal/PrivateVoice-Dictation-2.1.28-build20260611.1636-universal-macappstore.pkg`
- SHA256:`110de4348f52a472a05d9c79fb33b4c713ddc123ee84e1ae99a335804333d7e5`。
- 补充整改记录文档和 QA 经验教训。
- 将本轮排查时覆盖到 `/Applications` 的 App 恢复为排查前备份。
## 关键决策
- App Store Connect 当前审核版本仍为 `2.1.28`,本轮只递增 build,不改 marketing version。
- `keychain-access-groups` 不再写入签名 entitlements。
- QA 收敛到项目内稳定脚本入口,不再临时拼 GUI/AX/截图/日志命令。
- App Store Connect 当前审核版本仍为 `2.1.28`,本轮只递增 build,不改 marketing version。
- `keychain-access-groups` 不再写入签名 entitlements。
- QA 收敛到项目内稳定脚本入口,不再临时拼 GUI/AX/截图/日志命令。
- 本机直接 `open` Mac App Store-signed `.app` 受本地 Gatekeeper / MAS 环境影响,不作为最终启动验收结论;最终启动结果以 App Store Connect/TestFlight/Apple 审核环境为准。
## 文件变更
- `CHANGELOG.md`
- `Docs/KM2.项目管理-非业务直接相关/AppStore审核拒绝-20260610.md`
- 将 `20260611.1636` release 资料标记为 deprecated,不再作为上传指引。
- 新增 `20260611.1907` release manifest 和 App Store Connect 上传说明。
- 创建本地 tag:`v2.1.28-build20260611.1907-appstore-hotfix`;删除本地旧 tag:`v2.1.28-build20260611.1636-appstore-hotfix`。
### 文件变更
- `CHANGELOG.md`
- `Docs/KM2.项目管理-非业务直接相关/AppStore审核拒绝-20260610.md`
- `Docs/KM2.项目管理-非业务直接相关/QA工作-经验与教训.md`
- `Release/PrivateVoice-Dictation-2.1.28-build20260611.1636/APP_STORE_CONNECT_SUBMISSION.md`

2026-06-23 2026-06-23-AppStore四审会诊.md

- 如果 Wails bridge、后端语言检测、沙盒子进程或 JS 初始化任一环节卡住,窗口可能无限空白。
- `Release/AppStore-2.1.28-20260614.0102-launchfix/RELEASE_MANIFEST.md`
  - 启动证据只有 `Application initialized, starting Wails` 和 `Wails application started`。
  - 构建命令使用了 `PRIVATEVOICE_SKIP_FRONTEND_BUILD=1`,增加前端 dist 与当前源码不一致的风险。
- `qa-macappstore-pkg-launch-macos.sh`
  - 通过本地重签名 mirror 启动,不是最终 MAS-signed app 的真实安装/审核路径。
  - 只等待日志和进程存活,没有截图、像素非空白、窗口内容或 WebView console 断言。
## 结论
- 移除启动期 Accessibility prompt。
   - 移除或禁用全局 CGEventTap 热键监听,改成本 App 内快捷键、按钮、菜单项,或只在非 MAS 版本保留全局热键。
   - 移除任意 App 自动键盘输入/自动粘贴,改为复制到剪贴板后提示用户手动粘贴,或重做为真正输入法/InputMethodKit 架构。
5. 首屏必须先渲染可见 shell/loading/error,不能被第一条 Wails RPC 硬门控;所有首屏 RPC 应有超时和 fallback。
6. QA 必须加入真实 UI 证据:最终安装路径、干净 TCC、无模型、首次启动、截图/录屏非空白、关键文本可见、可点击下载模型。
## 下一步建议
- 先做 MAS 版本产品策略决策:App Store 版是否接受“无全局热键、无自动上屏,只复制到剪贴板/手动粘贴”的降级能力。
- 如果不接受降级,则需要评估真正输入法架构或继续走非 App Store 分发。
- 先做 MAS 版本产品策略决策:App Store 版是否接受“无全局热键、无自动上屏,只复制到剪贴板/手动粘贴”的降级能力。
- 如果不接受降级,则需要评估真正输入法架构或继续走非 App Store 分发。
- 开发完成后,不得再只用日志 smoke;必须用真实 UI smoke 和 Apple 权限政策门禁作为上传前阻断项。

2026-06-23 2026-06-23-输入法架构会诊.md

- 评估如果坚持 App Store 版本保留“任意应用输入”,是否应改为真正 macOS 输入法架构。
- 拉三位架构师和两位 QA 会诊,讨论可行性、风险、实现路径,以及应分几个 round 实现。
- 本轮只做架构分析和路线建议,不改产品代码、不打包、不上传。
## 当前起点
- Apple 在 2026-06-23 驳回 `2.1.28 (20260614.102)`。
- 主要拒绝点:
  - `Guideline 2.4.5 - Performance`:App 请求 Accessibility 并监听 keystrokes,但用途不是辅助功能;Apple 建议 `NSEvent.addLocalMonitor`。
3. 如果坚持 App Store 版本保留“跨 App 当前输入框输入”,真正输入法架构是唯一接近 Apple 系统语义的方向。
   - 技术上应通过 `InputMethodKit`/输入源接收文本输入上下文,并向当前 client 提交文字。
   - 但它不是现有体验的无损替代。
4. 输入法路线必须先做 Round 0 可行性验证,不能直接大改主架构。
   - 最大风险不是 IMK 能不能写,而是 Mac App Store 是否允许以合规方式交付/启用 macOS 输入法。
   - 传统 macOS IME 常需要进入 `~/Library/Input Methods` 或 `/Library/Input Methods`,这可能与 MAS 自包含和不得向共享位置安装代码的规则冲突。
## 用户体验判断
- 负责设置、模型下载、词库、历史、权限说明、输入法启用引导、菜单栏/主窗口。
  - 不再承担 App Store 版本的全局键盘监听和模拟上屏。
- `PrivateVoiceInputMethod`
  - 原生 Swift/Objective-C 的 `InputMethodKit` 输入法组件。
  - 负责输入法事件处理、状态展示、candidate/HUD、向当前文本 client commit 文本。
  - 不记录普通按键,不做通用 key logging。
- `PrivateVoiceASR`
  - 复用现有 Go 离线 ASR 能力。

2026-06-24 2026-06-24-AppStore输入法worktree.md

- 分支:`codex/appstore-ime-2.1.28`
- 起点 tag:`v2.1.28-build20260614.0102-appstore-launchfix`
- 起点 commit:`f620c43cfa290154bc0c4b610708963a6d277ba3`
- 起点提交说明:`Fix Mac App Store launch and package validation`
## 核对结果
- 新 worktree 已创建成功。
- 新 worktree 当前分支为 `codex/appstore-ime-2.1.28`。
- 新 worktree 工作区状态干净。

2026-06-24 2026-06-24-重大决议-双分支路线.md

- 分支名:`codex/x-asr-multilingual-2.1.31`
- 起点 tag:`v2.1.31-build20260614.2056-xasr-hold-precapture`
- 起点 commit:`e86df221fa8f9d6796fb7fe59020767d7c806fac`
- 起点提交说明:`Fix X-ASR hold pre-capture`
- 使命:
  - 探索增强国际多语种输入能力。
  - 探索多语种输入体验优化。
  - 可以继续围绕 X-ASR、多模型、多语言和用户输入体验演进。
## 分支二:App Store 输入法架构探索
- 分支名:`codex/appstore-ime-2.1.28`
- 起点 tag:`v2.1.28-build20260614.0102-appstore-launchfix`
- 起点 commit:`f620c43cfa290154bc0c4b610708963a6d277ba3`
- 起点提交说明:`Fix Mac App Store launch and package validation`
- 使命:
  - 只探索当前中文和英语两个语言的输入能力。
  - 不扩充语言范围。
  - 按 Apple App Store 审核要求,探索将现有逻辑改造为 Apple 可认可的输入法架构。
  - 重点验证是否可不用 Accessibility、Input Monitoring、CGEventTap、CGEventPost 和模拟粘贴完成跨 App 文本输入。

2026-07-03 26.0703-PrivateVoice2.AppStore输入法-语音Spike.md

## 核心事实 / 变更快照
### 项目接手事实
- 变更对象:PrivateVoice 当前项目根、Git 根、源码根和活跃台账认知。
- 事实来源:`/Users/ar/Projects/PrivateVoice/AGENTS.md`、`PROJECT.md`、`02-P/进度地图.md`、`03-O/CODEGRAPH.md`,以及本轮只读 Git / 目录核验。
- 文档声明:
  - 项目名:PrivateVoice2。
  - 当前项目根:`/Users/ar/Projects/PrivateVoice2`。
1. 先解决项目路径口径和 Git 基线问题。
  2. PMO / 代码治理确认从哪个干净基线创建实验分支:产品发布基线 `0ffbf1935c9d091cce22a5583275ac0902f7a693`,或迁移接手包 HEAD `abb4698`。
  3. 建议使用独立 worktree、独立 bundle id、独立实验 app record,避免污染主线和既有 App Store 记录。
- 建议验收四步:
  1. Sandboxed macOS 输入法壳可启用,且不请求 Accessibility。
  2. PrivateVoice 输入法激活时可稳定收到按下 / 松开触发;初期可用假文本代替真实 ASR。
  3. 识别 / 假文本结果可通过输入法 API 提交到当前文本框,不用粘贴、不用事件注入。
  4. 最小包走 App Store / TestFlight 审核路径,确认是否仍因 Guideline 2.4.5 Accessibility 或输入法安装 / 沙盒形态被拒。
- 放弃条件:
  - 关键体验必须依赖 Accessibility、全局键盘监听或模拟粘贴。
- 已只读查看项目会话目录:`/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/`。
- 已确认本轮不是版本冻结、阶段性发布收口或主题汇编整理请求;因此未更新 `00-Topics.md`。
- 本轮未运行构建、测试、打包或本地 App 验证。
- 本轮未创建分支或 worktree。
## 未决问题
- 项目 canonical root 未解决:文档声明 `/Users/ar/Projects/PrivateVoice2`,实际可用目录为 `/Users/ar/Projects/PrivateVoice`。
- 当前 Git 工作树不干净,且包含大量 AppleDouble 噪声和权限位变化;实验分支不能直接从该状态开。
- App Store 输入法路线没有找到可公开核验的第三方 macOS 语音输入法成功先例;审核通过把握仍低于本地技术闭环。

2026-07-08 26.0708-PrivateVoice.AX路线决策-主线合并暂缓.md

## 核心事实 / 变更快照
- 变更对象:`AX-10BS` 主线合并决策与 AX 后续路线。
- 事实来源:
  - `/Users/ar/Projects/PrivateVoice/02-P/进度地图.md`
  - 本轮 Owner 明确表述:合并的唯一理由是确定可用新方案冲击 App Store;如果不确定,就不能合并;宁可继续让分支独立走,失败后放弃该分支并回到 main 走独立站 / 独立发布路线。
- 变更前:
  - `AX-QA-PERMISSION PASS` 后,台账登记 `AX-10BS` 为 `waiting-owner / decision-needed`,等待 Owner 决定是否启动本地主线合并执行。
  - 该状态容易被误读为“技术 QA 通过后即可请求合 main”。
- 本轮不合并 main。
  - 本轮不构建、不发布、不 tag、不生成 manifest / SHA256、不刷新 codebase-memory。
  - 本轮不做 cherry-pick,只保留未来可回收性。
- 验证证据:
  - 台账已更新 `AX-10BS`、`AX-10BT` 和 `Progress Log`。
## 专业判断
本轮判断是:Owner 的风险直觉正确。AX 分支已证明本地技术链路有进展,但还没有证明 MAS / App Store 可行。主线合并会把 main 背上 MAS / AX 专项复杂度;如果上架失败,独立站路线会承受额外清理成本。
- 录音状态机中已经被验证过的稳定修复。
- QA 矩阵、权限矩阵和不可写目标边界经验。
不应整体搬入独立发布主线的内容包括:
- 只服务 MAS / AX App Store 审核路线的完整分支形态。
- 未证明对独立发布有价值的 App Store 专项门禁、文案和架构折中。
- 为了当前 AX 分支临时引入、但独立发布路线不需要的复杂度。
## 文件变更

来源索引

时间线

2026-06-11 2026-06-11-AppStore整改.md

  • 原始标题:2026-06-11 App Store 拒审整改
  • 在隔离 worktree /Users/ar/Projects/PrivateVoice/.worktrees/appstore-2.1.28-launch-hotfix 内继续整改,未改主工作区脏改。
  • 新增稳定验证脚本 privatevoice.src/scripts/verify-macappstore-pkg-macos.sh
  • privatevoice.src/scripts/build-macappstore-pkg-macos.sh 在每个 .pkg 生成后调用稳定验证脚本。
  • build 元数据更新为 2.1.28 (20260611.1636)
  • 生成新 universal Mac App Store 上传包:

2026-06-23 2026-06-23-AppStore四审会诊.md

  • 原始标题:2026-06-23 AppStore 四审会诊
  • 查看 macOS App Version 2.1.28 再次被 Apple 拒绝的原因。
  • 拉上 4 位代码审核员会诊,确认到底是什么问题。
  • 本轮只做诊断和建议,不改代码、不打包、不上传、不在 App Store Connect 做提交动作。

2026-06-23 2026-06-23-输入法架构会诊.md

  • 原始标题:2026-06-23 输入法架构会诊
  • 交付物:最小 IMK 工程、签名/沙盒/分发实验、DTS/App Review 问题清单、明确 go/no-go 结论。
  • 通过门槛:存在可执行的 MAS 分发路径,并能在常见文本框提交固定文本。
  • 停止门槛:仍需共享目录安装代码、仍需 AX/全局监听/模拟输入,或 Apple 明确不支持。
  • 交付物:MAS 构建或 Developer ID 构建决策、签名脚本、entitlements、Review Notes、截图/录屏、QA 证据包。
  • 通过门槛:P0 应用通过率 100%;MAS archive 不包含 AX/Input Monitoring/CGEventTap/CGEventPost 路径;blank screen 已解决。

2026-06-24 2026-06-24-AppStore输入法Round0.md

  • 原始标题:2026-06-24 AppStore 输入法 Round0
  • 将 App Store 输入法路线拆成五轮 todo。
  • codex/appstore-ime-2.1.28 独立 worktree 内开始推进 Round 0。
  • 保持与多语种分支隔离,不从多语种分支合并实验代码。

2026-06-24 2026-06-24-AppStore输入法worktree.md

  • 原始标题:2026-06-24 AppStore 输入法 worktree
  • 为 App Store 输入法架构探索创建独立 worktree。
  • 避免 Round 0 研发失败时污染当前主工作区。
  • 当前只准备研发现场,不开始实现、不打包、不提交 App Store。

2026-06-24 2026-06-24-重大决议-双分支路线.md

  • 原始标题:2026-06-24 双分支路线
  • 将 PrivateVoice 后续研发拆成两条彼此独立发展的分支线。
  • 当前不考虑两条分支互相合并。
  • 先建立清晰分支起点,避免新需求失败后污染可回滚基线。

2026-07-03 26.0703-PrivateVoice2.AppStore输入法-语音Spike.md

  • 原始标题:26.0703-PrivateVoice2.AppStore输入法-语音Spike
  • 已按项目入口读取并接手:AGENTS.mdPROJECT.mdINDEX.md02-P/进度地图.md02-P/角色协作宪章.md02-P/事件地图.md03-O/CODEGRAPH.md03-O/K2.项目管理/新窗口接手指南.md
  • 已补读治理相关规则:project-governance.mdwork-continuity.mdpre-implementation-discussion.mdsession-memory.md
  • 已分析 Apple 拒审邮件:核心拒审点是 Guideline 2.4.5 下 Accessibility 被用于非无障碍目的,具体为获取 keystrokes;另有 Guideline 2.1(a) 启动白屏问题。
  • 已澄清输入法路线的关键边界:App Store 版不能继续依赖 Accessibility、全局键盘监听或模拟粘贴;必须让触发和上屏都进入输入法官方通道。
  • 已澄清“按住快捷键说话,上屏”可以保留为输入法激活状态下的交互形态,但不能保留成无条件系统级全局热键。

2026-07-08 26.0708-PrivateVoice.AX路线决策-主线合并暂缓.md

  • 原始标题:AX 路线决策:主线合并暂缓
  • 与 Owner 对齐:本地 QA PASS 或 AX-QA-PERMISSION PASS 不足以成为合并 main 的理由。
  • AX-10BSwaiting-owner / decision-needed 更新为 OWNER_DECISION / HOLD_MAINLINE_MERGE
  • 新增 AX-10BT 作为 AX 分支继续证明 MAS / App Store 可行性的后续规划入口。
  • 追加 02-P/进度地图.md Progress Log,记录本轮战略决策。
    1. 当前不启动本地主线合并。