尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

macOS应用公证总是失败?xcnotary precheck帮你提前揪出4大签名隐患

macOS应用公证总是失败?xcnotary precheck帮你提前揪出4大签名隐患 macOS应用公证总是失败xcnotary precheck帮你提前揪出4大签名隐患【免费下载链接】xcnotarythe missing macOS app notarization helper, built with Rust项目地址: https://gitcode.com/gh_mirrors/xc/xcnotarymacOS应用公证Notarization是 Mac 开发者发布软件绕不过的一关打包、上传苹果服务器、等待几分钟轮询结果……可一旦代码签名配置有问题苹果只会冷冰冰地回一句Invalid你却得从头排查到底是哪一步签名出了问题。开源工具xcnotary就是一个用 Rust 构建的 macOS 应用公证助手它把公证全流程自动化还能在上传前先跑一次precheck本地预检提前揪出 4 大常见签名隐患帮你省掉白等几分钟的时间。公证失败为什么总是等了几分钟才知道按照苹果的设计公证流程大致是把.app/.dmg/.pkg提交给公证服务 → 服务端检查签名、权限等 → 返回成功或失败日志。这个过程通常需要几分钟而且只有提交后才会得到权威结论。也就是说哪怕你漏加了一个签名参数也要等几分钟后才会在失败日志里看到原因。Apple 的官方建议是Always check the log file, even if notarization succeeds.xcnotary 的思路就是把常见错误前置在提交之前先在本地做一轮快速的代码签名预检fast-fail有问题立刻告诉你错在哪、怎么改。xcnotary precheck一条命令完成本地预检先通过 Homebrew 安装brew install akeru-inc/tap/xcnotary然后对你的应用 Bundle 执行预检无需账号密码纯本地检查xcnotary precheck HelloWorld.app从图中可以看到前三项检查Developer ID 签名、Hardened Runtime、无 get-task-allow 权限全部通过 ✅第四项**安全时间戳Secure Timestamp**检查失败工具立刻输出三段式报错Pre-notarization check failed说明失败原因The bundle is missing a secure timestampSuggested fix直接给出修复方法如加--timestamp参数See also附官方文档链接这种原因 建议 参考的报错结构定义在 src/precheck/error.rs 中对新手非常友好——不用再去猜日志。深入解析precheck 揪出的 4 大签名隐患针对.appBundlexcnotary 会依次执行 4 项检查实现位于 src/precheck/bundle.rs隐患一未使用 Developer ID 证书签名或存在未签名二进制苹果要求分发的应用必须用Developer ID证书签名且内部不能有无签名的可执行文件。precheck 会用系统自带的spctl做验证。 对应修复构建时指定CODE_SIGN_IDENTITY为 Developer ID Application: 你的团队名。隐患二未启用 Hardened Runtime加固运行时从 macOS 10.15 开始公证要求应用启用加固运行时。xcnotary 会读取codesign --display输出检查 CodeDirectory 的 flags 里是否带有runtime。 对应修复构建时传OTHER_CODE_SIGN_FLAGS--optionsruntime或在 Xcode 的 Target → Signing and Capabilities 里勾选 Hardened Runtime。隐患三残留 get-task-allow 调试权限get-task-allow是 Xcode 调试模式下默认注入的权限它允许调试器附加到进程。带着它发布的应用会被公证服务拒绝。 对应修复构建时加CODE_SIGN_INJECT_BASE_ENTITLEMENTSNO别把 Xcode 调试权限带进发布包。隐患四签名缺少 Secure Timestamp安全时间戳安全时间戳用于证明签名发生的时间点防止证书吊销后签名仍可被验证。xcnotary 通过codesign -dvv检查输出中是否存在Timestamp字段。 对应修复签名时加--timestamp参数xcodebuild 场景传OTHER_CODE_SIGN_FLAGS--timestamp。这 4 项检查覆盖了绝大多数公证秒拒场景对应的测试用例与产物生成脚本见 tests/precheck.rs 和 tests/build_artifacts.sh。.dmg 和 .pkg 安装包也能查但只查一项当输入是.dmg或.pkg时由于不方便在不解包的情况下深入检查内容xcnotary 只做Developer ID 签名检查.dmg 检查逻辑验证磁盘映像的签名.pkg 检查逻辑验证安装包签名 建议在 CI 中先对.app跑完整 precheck再打包含它的 dmg/pkg这样问题都能在打包前暴露。检查项的分发逻辑在 src/precheck/mod.rs 中按输入类型自动选择。检查全过用 xcnotary notarize 一键完成公证预检通过后一条命令即可走完压缩 → 上传 → 轮询等待 → Stapling全流程xcnotary notarize HelloWorld.app \ -d developerapple.com \ -k KeychainPasswordItem整个流程封装在 src/notarize/run.rs 中几个值得注意的细节密码不进命令行xcnotary 本身不保管你的开发者密码而是让 Xcode 的altool直接从钥匙串读取先用xcrun altool --store-password-in-keychain-item存好多团队账号账号关联多个开发团队时用--provider指定 ProviderShortname自动 Stapling公证成功后自动把票据钉到应用上离线状态也能通过 Gatekeeper失败即输出日志公证失败时会自动拉取苹果的服务端错误日志打印到终端CI 友好成功返回 0、失败返回非 0方便接入自动化流水线命令行参数定义见 src/util/cli.rs入口逻辑在 src/main.rs。实用小贴士成功也要看日志Apple 明确建议即使公证成功也要检查服务响应日志其中可能含有下次提交前要修复的警告。xcnotary 默认会在成功后一并输出日志想直接看服务端诊断加--no-precheck可跳过本地检查直接交给公证服务排查适合疑难杂症⏱️新 Xcode 用户较新的 Xcode 已提供xcrun notarytool --wait可直接替代上传并轮询环节xcnotary 的本地预检思路precheck依然值得借鉴 版本历史见 CHANGELOG.md写在最后macOS 应用公证失败大多不是玄学而是 4 个签名配置的老问题Developer ID 签名、Hardened Runtime、get-task-allow 权限、Secure Timestamp。用xcnotary precheck把检查前置到本地几分钟的等待变成几秒钟的定位配合自动化的notarize命令发布流程可以真正做到一键搞定。【免费下载链接】xcnotarythe missing macOS app notarization helper, built with Rust项目地址: https://gitcode.com/gh_mirrors/xc/xcnotary创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表