应直接使用QtAutoUpdater而非手写QNetworkAccessManager实现更新,因其已封装平台适配、权限处理、安装时机控制及多后端支持,开箱即用且生产就绪;QSimpleUpdater仅支持检查与跳转下载,无安装能力,二者不可混用。

直接用 QtAutoUpdater,别自己造轮子。它不是“能用”,而是“开箱即用且生产就绪”——核心逻辑、权限处理、安装时机控制、多后端适配都已封装好,你只需要配 URL 和选后端。
为什么不用手写 QNetworkAccessManager + JSON 解析
自己发请求、比版本、弹窗、下载、校验、替换文件,看似可控,实则埋坑密集:
- Windows 上更新主程序时需退出再安装,否则
QFile::rename失败(进程锁住 exe) - macOS 要求签名一致性,未重签名的更新包会被 Gatekeeper 拦截
- Linux 不同发行版包管理策略不同(APT/YUM/Flatpak),硬编码下载路径会失效
- Android 需要
REQUEST_INSTALL_PACKAGES权限 +FileProvider分享 APK,QNetworkReply下载完直接调startActivity会 crash - 没做断点续传、没校验 SHA256、没处理 HTTPS 证书链异常,用户一升级就卡死或损坏
这些不是“功能点”,是上线前必须解决的阻塞问题。而 QtAutoUpdater 的 UpdateInstaller 模块已内置对应平台的安装策略。
QtAutoUpdater 最简可用配置(Web 后端)
适用场景:你用自建 HTTP 服务器托管更新包和 JSON 元数据,不依赖 Qt Installer Framework 或系统包管理器。
只需三步:
- 在
.pro文件中添加:QT += autoupdatercore - 代码中初始化控制器:
auto controller = new QtAutoUpdater::UpdateController(this); controller->setBackend("webquery", {{"url", "https://your-server.com/updates.json"}}); controller->checkForUpdates(); - JSON 文件格式必须含
version、download-url、checksum字段,例如:{ "version": "1.2.3", "download-url": "https://your-server.com/app-v1.2.3.tar.gz", "checksum": "sha256:abcd1234...", "changelog": "修复崩溃问题" }
注意:webquery 后端默认只校验 checksum,不校验证书;如需严格 HTTPS,得手动设置 QSslConfiguration 并传给 QNetworkAccessManager 实例,再注入到 controller。
QSimpleUpdater 和 QtAutoUpdater 别混用
两者定位完全不同:
-
QSimpleUpdater是轻量级单文件方案,只做“检查+跳转浏览器下载”,不处理安装。它的checkForUpdates()返回的是信号,没有下载器、没有安装器、没有后台服务。 -
QtAutoUpdater是完整生命周期管理,包含UpdateController(调度)、UpdaterBackend(协议适配)、UpdateInstaller(平台安装)、AdminAuthoriser(提权)。它甚至支持“静默更新”和“下次启动时安装”模式。 - 如果你已在项目里用了
QSimpleUpdater,切勿把它和QtAutoUpdater的实例共存——它们都依赖QNetworkAccessManager,容易抢夺 reply 对象导致QNetworkReply::error为OperationCanceledError。
真要轻量,就只用 QSimpleUpdater;要可靠落地,就一步到位上 QtAutoUpdater。中间路线反而最耗时。
Android 上的特殊处理必须显式声明
即使用了 QtAutoUpdater,Android 仍需额外两步,否则更新安装必然失败:
- 在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"></uses-permission>
- 在
android/src/main/res/xml/file_paths.xml中配置FileProvider路径,确保下载的 APK 可被Intent安装;QtAutoUpdater不会自动帮你生成这个文件。 - 确认你的 APK 签名与旧版一致,否则系统拒绝覆盖安装——这点和桌面端完全不同,容易忽略。
桌面端更新失败顶多弹个错,Android 上失败就是白屏或闪退,而且日志里只有模糊的 Package installer has stopped。务必在真机上走完整流程验证。











