我如何在Qt跨平台应用程序中启用自动更新?

我喜欢能够在没有用户的努力下更新自己的应用程序(想想:Mac的Sparkle框架)。 是否有任何代码/库可以在Qt应用程序中使用,而无需担心操作系统细节?

至less对于Windows,Mac和用户拥有的Linux二进制文件。

我可以将Sparkle整合到Mac版本上,为Linux案例编写代码(仅适用于独立的,用户拥有的二进制文件;如果我的程序是封装的,我不会嘲笑分发包装),并find某人帮助我Windows方面,但这是非常痛苦的。

这不是一个完整的解决scheme,但是可以在https://github.com/mendeley/Update-Installer上find一个用于创build自动更新包并安装它们的跨平台(Windows,Mac,Linux)工具。; 此工具不处理发布更新或下载它们。

这是为基于Qt的应用程序编写的,但为了使更新安装程序更小,独立并且易于构build,安装程序仅使用标准系统库(C ++运行时,Linux / Mac上的pthreads / libz / libbz2,Windows上的Win32 API ,Mac上的Cocoa,Linux上的GTK)。 这简化了提供更新,包括您的应用程序可能依赖的Qt和其他非系统库的新版本。

在考虑这个之前,我会build议:

  • 如果您只是为两个平台构build,请考虑为这些平台使用标准且经过充分testing的自动更新框架 – 例如。 Mac上的Sparkle ,Windows上的Google's Omaha或自动更新系统(例如InstallShield)。 我还没有试过BitRock。
  • 在Mac上,Mac App Store可能是一个不错的select。 尽pipe如此,请参阅https://bugreports.qt.io/browse/QTBUG-16549
  • 在Linux上,考虑创build一个.deb包和一个简单的存储库来存放它。 一旦用户build立了一个存储库,系统范围的软件更新工具将负责检查和安装新版本。 然而,对于许多新的Ubuntu / Debian用户来说,设置新存储库的步骤太复杂了。 我们所做的以及Dropbox和Google所做的工作就是创build一个.deb包,它将存储库设置为包安装的一部分。

关于创build更新程序的其他一些注意事项:

  • 在Windows Vista / 7上,如果应用程序安装在系统范围内(例如,在C:\ Program Files \ $ APPNAME中),则当更新程序尝试获取写入安装目录的权限时,用户将看到一个可怕的UAC提示。 这可以通过安装到用户可写的目录(我收集这是Google Chrome所执行的操作)或通过获取Authenticode证书并使用它来签署更新程序二进制文件来避免。
  • 在Windows Vista / 7中,应用程序.exe或DLL如果在使用中不能被删除,但是更新程序可以将现有的.exe / DLL移到临时目录中,并安排在下一次重新引导时进行删除。
  • 在Ubuntu上,第三方存储库在分发更新后被禁用。 Google通过创build一个cron-job来解决这个问题,以便在必要时重新添加存储库。

无耻的插件: Fervor ,一个由Sparkle启发的简单的多平台(基于Qt的)应用程序自动播放器。

无耻的插件:这是一个相对较老的问题,但我认为提到一个我最近创build的库,我称之为“QSimpleUpdater”可能是有用的。 除了通知您是否有更新的版本,它允许您以任何格式(如HTML或RTF)下载更改日志,并使用对话框直接从应用程序下载更新。

正如你可能从Qt项目中所期望的那样,它可以在Qt支持的任何平台上运行(在Windows,Mac和Linux上testing)。

链接:

  • 网站
  • GitHub仓库

截图:

在这里输入图像说明

虽然它的工作方式与Sparkle有所不同,但BitRock InstallBuilde r包含一个用Qt编写的autoupdater,可以独立使用(免责声明,我是原BitRock开发人员)。 这是一个商业应用程序,但我们有免费的开源项目许可证。

我发现WebUpdate非常有用,尽pipe它是用wxWidgets编写的。 但别担心,这是一个单独的应用程序来处理您的更新。 整合它的步骤非常简单 – 只需编写两个XML文件并运行更新程序即可。 是的,它是跨平台的。

它的优点是它会自动下载和解压缩/安装所有你需要的,而不仅仅是提供一个popup窗口通知有关新版本和链接下载。 你可以用它做的另一件事是可定制的行动。

项目的主页在这里 ,你可以阅读文档或看看官方教程 。

我开发了一个自动更新程序库,在Mac OS X,Linux和几乎所有的Unix上运行都非常好,允许您在文件仍然打开时取消链接文件。 原因是我只是提取下载的软件包在现有的应用程序的顶部。 不幸的是,因为我依赖于这个function,所以我在Windows上遇到了问题,因为Windows不允许你断开一个打开的文件。

我能find的唯一select是使用MoveFileExreplace重启标志,但这是可怕的。

但是,重命名应用程序的工作目录可以在Windows 7和Windows XP上运行。 我还没有尝试过Windows Vista。

Mixing Cocoa和Qt博客文章可以解决Mac平台的问题。

您可以使用UpdateNode ,它提供了更新软件的所有可能性。 它使用一个跨平台的Qt客户端,免费用于开源!

更新只是做了一些进一步的分析,真的很喜欢这个解决scheme:

优点:

  • 免费开源! 即使客户端是开放源代码: https : //github.com/updatenode/unclient
  • 客户端已经被本地化为几种语言
  • 在更新方面非常灵活。 你甚至可以更新单个非二进制文件。
  • 另外还提​​供了一种通过客户端显示消息的方法。
  • 准备使用二进制文件和安装程序为所有常见的Linux发行版,单一的Windows二进制文件,以及安装程序和Mac的解决scheme(我还没有尝试,因为我没有一个Mac)
  • 易于使用的Web服务,很好的统计数据和更新检查是在几分钟内整合的

缺点:

  • 我错过了在线服务中的多用户pipe理。 也许他们将来会这样做 – 我肯定会在他们的反馈门户中提出build议
  • 客户端只是一个GUI客户端 – 所以,你需要把它缩小到没有GUI前端的情况下运行(也许只有像我这样的人才需要这样做;-))

所以,底线,因为这个解决scheme是相当新的,我认为这里有很大的潜力。 我一定会在我的项目中使用它,我期待更多的从他们! 竖起大拇指!

我build议你阅读插件,以及如何创build和使用它们。 如果你的应用程序体系结构是模块化的,并被分成不同的插件。 查看Google自动更新实用程序http://code.google.com/p/omaha/ 。 我们用这个。

Thibault Cuvelier正在编写一个教程(用法语)来开发更新程序。 我知道这些解释是法文的(每个人都不懂法文),但我认为这可以通过Google翻译这样的网页翻译器来阅读。 有了这个,你将有一个跨平台的更新,但你需要自己写。

据我所知,本教程中解释的更新程序的唯一部分是文件下载部分。 在这种情况下可以帮助你,参考教程, 更新avec Qt

我希望有帮助。

好的,所以我想我把它当作一个“不(跨平台)的方式”。 这太糟糕了!