edit | blame | history | raw

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.shverify-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-groupsITSAppUsesNonExemptEncryption=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-groupsITSAppUsesNonExemptEncryption=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 反向补门禁。