# 2026-06-11 App Store 拒审整改 ## 用户目标 修复 PrivateVoice `2.1.28` Mac App Store 审核拒绝问题,重点处理最终 `.pkg` 中的 `com.apple.quarantine`、签名 entitlements、build 编号和可复核 QA 证据。 ## 已完成事项 - 在隔离 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 上传包: `/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/截图/日志命令。 - 本机直接 `open` Mac App Store-signed `.app` 受本地 Gatekeeper / MAS 环境影响,不作为最终启动验收结论;最终启动结果以 App Store Connect/TestFlight/Apple 审核环境为准。 ## 文件变更 - `CHANGELOG.md` - `Docs/KM2.项目管理-非业务直接相关/AppStore审核拒绝-20260610.md` - `Docs/KM2.项目管理-非业务直接相关/QA工作-经验与教训.md` - `privatevoice.src/app.go` - `privatevoice.src/build/darwin/Info.plist` - `privatevoice.src/frontend/src/components/settings/AboutPage.svelte` - `privatevoice.src/scripts/build-macappstore-pkg-macos.sh` - `privatevoice.src/scripts/verify-macappstore-pkg-macos.sh` ## QA 结论 - `bash -n` 通过:`build-macappstore-pkg-macos.sh`、`verify-macappstore-pkg-macos.sh`。 - 构建命令成功:`privatevoice.src/scripts/build-macappstore-pkg-macos.sh universal`。 - arm64、x86_64、universal `.pkg` 都通过稳定验证脚本。 - 终包验证结果:无 `com.apple.quarantine`;payload app 签名有效;entitlements 与 profile 匹配;无 `keychain-access-groups`;`ITSAppUsesNonExemptEncryption=false`。 - 观察到 AppleDouble/Finder metadata warning,来自 macOS `com.apple.provenance` 类系统扩展属性;当前不作为 Apple 明确拒绝项。 ## 未决问题 - 需要用户上传 `20260611.1636` universal `.pkg` 到 App Store Connect 并选择新 build 重新提交审核。 - 如 Apple 仍拒绝“无法启动”,应优先获取 Apple 侧崩溃/审核日志,而不是继续用本机临时 `open` 判断。 ## 2026-06-11 409 证书整改追加 ### 用户目标 处理 App Store Connect 上传 `20260611.1636` 后的新错误:`Validation failed (409)`,Apple 指出 `Contents/Frameworks/libonnxruntime.1.24.4.dylib` 必须使用 provisioning profile 内包含的证书签名。 ### 已完成事项 - 确认 `20260611.1636` 失败原因不是 quarantine,而是签名证书不匹配:失败包使用 app signing certificate `404B695635AF53AAF0A65956B935115BD5A9DD50`,profile 的 `DeveloperCertificates` 只包含 `0D7D5484FDE4EC1CA2C9225F1E71E65A256A1E7C`。 - 在 `privatevoice.src/scripts/build-macappstore-pkg-macos.sh` 增加开工前门禁:`PRIVATEVOICE_APPSTORE_APP_IDENTITY` 必须属于 profile `DeveloperCertificates`。 - 在 `privatevoice.src/scripts/verify-macappstore-pkg-macos.sh` 增加终包验证:payload app、主可执行和 Frameworks 下 dylib 都必须满足 profile certificate leaf requirement。 - build 元数据更新为 `2.1.28 (20260611.1907)`。 - 使用正确 app signing identity `0D7D5484FDE4EC1CA2C9225F1E71E65A256A1E7C` 重建并验证通过。 - 将 `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` - `Release/PrivateVoice-Dictation-2.1.28-build20260611.1636/RELEASE_MANIFEST.md` - `Release/PrivateVoice-Dictation-2.1.28-build20260611.1907/APP_STORE_CONNECT_SUBMISSION.md` - `Release/PrivateVoice-Dictation-2.1.28-build20260611.1907/RELEASE_MANIFEST.md` - `Release/PrivateVoice-Dictation-2.1.28-build20260611.1907/SHA256SUMS.txt` - `privatevoice.src/app.go` - `privatevoice.src/build/darwin/Info.plist` - `privatevoice.src/frontend/src/components/settings/AboutPage.svelte` - `privatevoice.src/scripts/build-macappstore-pkg-macos.sh` - `privatevoice.src/scripts/verify-macappstore-pkg-macos.sh` ### QA 结论 - `bash -n privatevoice.src/scripts/build-macappstore-pkg-macos.sh`: PASS。 - `bash -n privatevoice.src/scripts/verify-macappstore-pkg-macos.sh`: PASS。 - `git diff --check`: PASS。 - 终包稳定验证脚本 PASS:无 `com.apple.quarantine`;entitlements 与 profile 匹配;无 `keychain-access-groups`;`ITSAppUsesNonExemptEncryption=false`;payload app、主可执行和 bundled dylibs 均满足 profile 证书要求。 - 最终上传包: `/Users/ar/Projects/PrivateVoice/.worktrees/appstore-2.1.28-launch-hotfix/privatevoice.src/build/macappstore-hotfix-20260611.1907/universal/PrivateVoice-Dictation-2.1.28-build20260611.1907-universal-macappstore.pkg` - SHA256:`f5283fbe25689bfa6b7ead585318072c39acd9f91f87f34bd8053653342da90f`。 ### 未决问题 - 用户需要上传 `20260611.1907` universal `.pkg` 到 App Store Connect,等待处理完成后选择 build `20260611.1907` 并重新提交审核。 - 不要再上传 `20260611.1636`。 ## 2026-06-11 独立经验教训文档 ### 用户目标 用户指出已连续两次因为 App Store 打包不合格被 Apple 官方驳回,要求形成独立 Markdown 文档,总结经验教训。 ### 已完成事项 - 新增独立文档:`Docs/KM2.项目管理-非业务直接相关/AppStore打包连续返工经验教训-20260611.md`。 - 文档覆盖两次失败:`ITMS-91109` quarantine 属性、`Validation failed (409)` 签名证书不在 provisioning profile 内。 - 文档明确以后 Mac App Store 上传前必须以最终 `.pkg` 为唯一验收对象,并通过项目稳定脚本验证。 ### 后续建议 - 后续每次 Apple 返回新类型上传/审核错误,都必须把错误反向固化进 `verify-macappstore-pkg-macos.sh` 或 release checklist。 ## 2026-06-12 提交 20260611.1907 复审 ### 用户目标 用户要求代为操作 App Store Connect,将已上传的新 build `2.1.28 (20260611.1907)` 提交给 Apple 官方继续审核。 ### 已完成事项 - 在 App Store Connect 正式版本页确认旧 build 仍为 `2.1.28 (20260605.353)`,未直接提交。 - 从 Distribution / macOS App Version `2.1.28` 的 Build 区域移除旧 build `20260605.353`。 - 添加并保存新 build:`2.1.28 (20260611.1907)`。 - 确认 `Sign-In Required` 未勾选。 - 进入 review submission 详情页后点击 `Resubmit to App Review`。 ### 结果 - App Store Connect 显示当前提交状态:`Waiting for Review`。 - Items Submitted 中的版本为:`macOS App 2.1.28` / `2.1.28 (20260611.1907)`。 - 提交时间显示为:`Jun 12, 2026 at 5:19 PM`。 ### 后续建议 - 继续关注 Apple 邮件和 App Store Connect 状态变化。 - 若再次拒绝,先完整保存 Apple 原文,再按项目稳定脚本和 release checklist 反向补门禁。