Mac应用DMG公证失败:Sparkle框架签名与时间戳问题排查
Sparkle框架DMG公证失败的签名修复方案
针对你遇到的DMG公证时Sparkle文件出现“未用有效Developer ID证书签名”“缺少安全时间戳”的问题,按以下步骤排查修复:
先确认Sparkle框架的原始签名状态
官方预编译的Sparkle框架本身已经经过Apple公证签名,如果你是自行编译或修改过框架文件,会破坏原有签名。先检查框架二进制的签名信息:codesign -dv --verbose=4 YourApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Sparkle若输出显示签名无效或无时间戳,直接替换为官方最新预编译Sparkle包。
严格遵循签名与打包的顺序
错误的顺序会导致内部文件签名失效,正确流程:- 单独签名主应用,不要用--deep参数(递归签名会覆盖Sparkle的合法签名),必须带时间戳:
codesign --force --sign "Developer ID Application: 你的开发者ID信息" --timestamp --options runtime YourApp.app - 基于签名完成的
.app制作DMG(推荐用create-dmg工具,确保DMG仅包含已签名的应用) - 最后对DMG容器签名,同样带时间戳:
codesign --sign "Developer ID Application: 你的开发者ID信息" --timestamp YourApp.dmg
- 单独签名主应用,不要用--deep参数(递归签名会覆盖Sparkle的合法签名),必须带时间戳:
本地预验证再提交公证
提交notarytool之前,先通过spctl本地验证DMG的签名合法性:spctl -a -t open --context context:primary-signature -v YourApp.dmg只有本地验证通过,再提交公证,避免反复试错。
修正自定义签名函数的逻辑
检查你的codesignApp函数,如果包含--deep参数或者未添加--timestamp,会导致Sparkle文件的签名被错误处理。调整函数,仅签名主应用,不递归处理框架文件,且强制添加时间戳参数。
内容的提问来源于stack exchange,提问作者nonsequiter
相关产品推荐
相关产品推荐

