macOS Ventura下自动更新DMG后提示文件损坏的解决问询
修复macOS 13+下Qt应用自动更新的「文件已损坏」问题
问题根源
macOS 13 Ventura及以上版本强化了Gatekeeper的隔离机制:通过自定义程序(如你的QNetworkAccessManager下载逻辑)获取的文件,系统会自动添加com.apple.quarantine扩展属性。即便文件本身已签名公证,只要这个属性存在,启动时就会触发「文件已损坏,应移至废纸篓」的提示。而Safari下载的公证文件会被系统自动标记为安全来源,不会保留该属性,因此无此问题。
具体修复步骤
1. 下载DMG后立即移除隔离属性
在DMG文件写入磁盘完成后,执行xattr命令删除com.apple.quarantine属性:
xattr -d com.apple.quarantine /path/to/downloaded/YourApp.dmg
在Qt代码中可以通过QProcess调用该命令:
QProcess attrProcess; attrProcess.start("xattr", QStringList() << "-d" << "com.apple.quarantine" << downloadedDmgPath); attrProcess.waitForFinished(-1); // 等待命令执行完成
2. 移除挂载命令的-noverify参数
你当前使用hdiutil attach ... -noverify挂载DMG,该参数会跳过系统对DMG签名和公证的校验,可能导致系统无法正确识别文件的安全状态。建议移除该参数,让系统正常校验:
hdiutil attach /path/to/downloaded/YourApp.dmg
3. 替换应用后验证签名(可选)
替换旧应用后,可通过codesign命令验证签名完整性,确保替换过程未损坏文件:
codesign -vvv /Applications/YourApp.app
若输出包含valid on disk和satisfies its Designated Requirement,则签名状态正常。
4. (进阶)改用官方兼容的更新框架
如果长期维护需要,建议集成Sparkle更新框架(支持Qt应用),它会自动处理Gatekeeper隔离属性、签名校验等系统级逻辑,避免自定义更新的兼容性问题。
内容的提问来源于stack exchange,提问作者Violet Giraffe
相关产品推荐
相关产品推荐

