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

49
我喜欢那些能够在用户无需任何操作的情况下更新自己的应用程序(例如:Mac上的Sparkle框架)。有没有可以利用的代码/库来实现这个功能,而不必担心操作系统的细节呢?
至少要支持Windows、Mac和用户拥有的Linux二进制文件。
我可以在Mac版本上集成Sparkle,在Linux情况下编写一些代码(仅适用于独立的、用户拥有的二进制文件;如果我的程序被打包,我不会干扰distribution打包),并找人帮助我处理Windows端,但这太麻烦了。
13个回答

21

这不是一个完整的解决方案,但提供了一个跨平台(Windows、Mac、Linux)工具,用于创建自动更新和安装包,可在https://github.com/mendeley/Update-Installer上找到。该工具不涉及发布更新或下载更新。

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

不过,在考虑使用该工具之前,我建议:

  • 如果您只需要为两个平台构建,请考虑使用那些平台上经过标准测试和验证的自动更新框架,例如Mac上的Sparkle,Windows上的Google's Omaha 或内置于流行安装框架中的自动更新系统(例如InstallShield)。我没有尝试过BitRock。
  • 在Mac上,Mac App Store可能是一个不错的选择。不过请参见https://bugreports.qt.io/browse/QTBUG-16549
  • 在Linux上,考虑创建.deb包和一个简单的仓库来托管它。一旦用户设置好仓库,系统级别的软件更新工具将负责检查和安装新版本。然而,设置新仓库的步骤对于许多新手Ubuntu/Debian用户来说太复杂了。我们所做的,也是Dropbox和Google所做的,是创建一个.deb包,该包在安装过程中设置仓库。

关于创建更新程序的另外一些注意事项:

  • 在Windows Vista/7上,如果应用程序是系统范围内安装的(例如在C:\ Program Files \ $ APPNAME中),当更新程序尝试获取写入安装目录的权限时,用户将看到一个可怕的UAC提示。这可以通过安装到用户可写目录(我了解到这就是Google Chrome所做的)或获取Authenticode证书并使用它来签名更新程序二进制文件来避免。
  • 在Windows Vista/7上,如果应用程序的.exe或DLL正在使用中,则无法删除它们,但是更新程序可以将现有的.exe / DLL移动到临时目录中并计划在下一次重启时删除。
  • 在Ubuntu上,分发更新后会禁用第三方存储库。 Google通过创建cron作业以在必要时重新添加存储库来解决此问题。

系统服务是在Windows上更新时避免UAC提示的另一种方式。Mozilla正在使用这种方式来实现Firefox的新静默更新系统。 - Robert Knight

9

不要介意我宣传一下: Fervor,一个简单的多平台(基于Qt)应用程序自动更新器,灵感来源于Sparkle。


4
根据Ferver自述文件:“Ferver无法自动安装实际更新。用户可以选择手动下载和安装更新。”换句话说,它只是一个弹出窗口,提示“有新版本可用”? - Jens A. Koch
1
Jens,是的,但也有人需要创建弹出窗口。不过,欢迎提交推送请求;-) - Linas Valiukas
我找到了自动更新分支,看起来很不错 :) 谢谢你为此努力!! - Jens A. Koch

6

不要介意我做一下广告:虽然这是一个比较旧的问题,但我认为最近我创建的一个名为“QSimpleUpdater”的库可能会有所帮助。除了通知您是否存在更新版本外,它还允许您以任何格式(如HTML或RTF)下载更改日志,并使用对话框直接从您的应用程序中下载更新。

正如您所期望的那样,它可以在Qt支持的任何平台上运行(已经在Windows、Mac和Linux上测试过)。

链接:

截图:

enter image description here


3
我开发了一个自动更新库,它在Mac OS X、Linux和几乎所有允许在文件仍然打开的情况下取消链接文件的Unix系统上都能够很好地工作。原因是我只是在现有应用程序的顶部提取了下载的包。不幸的是,由于我依赖这个功能,在Windows上遇到了问题,因为Windows不允许您取消链接已打开的文件。我找到的唯一替代方法是使用带有重启标志的MoveFileEx,但那太糟糕了。然而,在Windows 7和Windows XP上重命名应用程序的工作目录可以解决问题。我还没有尝试过Windows Vista。

1
你的库链接在哪里?当需要更新多个exe文件时,你是如何处理的?(共享库、资源等) - F'x
它还没有上线。如果有兴趣,我可能会从中删除我的应用程序依赖项并将其放在github上。在Windows上,目前的工作方式是下载一个zip文件,将当前安装移出(我认为这可能只适用于NTFS,而不是FAT,但我不在乎),并在当前安装目录上解压缩。因此,这种方式可以更新多个资源而不会出现问题。在Unix上,它更简单:只需在应用程序上解压缩,因为Unix允许您在文件仍然打开时取消链接文件。 - Sohail

3
虽然它的工作方式与Sparkle有些不同,但BitRock InstallBuilder包含一个用Qt编写的自动更新程序,可以独立使用(免责声明,我是BitRock的原始开发人员)。这是一款商业应用程序,但我们为开源项目提供免费许可证。

2
这是一个旧问题,但回答中没有Squirrel,它是最佳解决方案。以下是我在qt 5.12.4中使用qt quick "my qml app"所做的事情,您可以在任何其他语言中进行操作。
1.下载nuget包资源管理器版本https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/releases 2.打开nuget包资源管理器,并添加此目录'lib/net45',无论您是否拥有.net应用程序,否则它将无法正常工作。 3.将所有文件添加到此文件夹中,在元数据中指定您的版本 4.保存nupkg文件 5.下载Squirrel版本https://github.com/Squirrel/Squirrel.Windows/releases 6.将Squirrel添加到Windows环境路径中 7.打开cmd并cd到nupkg文件的目录 8.squirrel --releasify file_name.nupkg ->现在在releases文件夹中,应该有setup.exe文件,它将安装应用程序和其他文件。 9.要创建新版本,请再次执行2,3,4,7,8,如果是更新,则会创建仅需要文件的增量文件,将这些文件放入您的服务目录中,例如网站的更新文件夹,您需要在IIS中禁用目录浏览,并且要自动更新应用程序,您需要调用Update.exe,它位于应用程序根目录的父文件夹中appdir/../update.exe --update http://yourserver.com/upates/,应用程序重新启动后,应该以新版本启动。 10.您可以在此处找到Squirrel的文档https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/getting-started/0-overview.md和nuget包资源管理器https://github.com/NuGetPackageExplorer/NuGetPackageExplorer的文档,如果您不想使用nuget包资源管理器进行动态生成版本,则也可以仅使用nuget.exe,可以从https://www.nuget.org/downloads下载。
那很简单。现在你有了自动更新应用程序,它将从服务器下载更新并自动更新应用程序。如需更多信息,请阅读文档。
注意:对于 iis 使用 https://github.com/Squirrel/OldSquirrelForWindows/issues/205。"最初的回答"

2

2
您可以使用UpdateNode,它为您提供更新软件的所有可能性。 它使用跨平台的Qt客户端,并且对Open Source免费!

更新 刚刚对此进行了进一步分析,我真的很喜欢这个解决方案:

优点:

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

缺点:

  • 我在在线服务中缺少多用户管理。也许他们将来会做这个 - 我一定会在他们的反馈门户中建议。
  • 客户端仅为GUI客户端 - 因此,您需要将其缩小以在没有GUI前端的情况下运行(可能仅适用于像我这样的人;-))

因此,总的来说,由于这个解决方案相当新,我认为这里有很大的潜力。我一定会在我的项目中使用它,并期待更多来自他们的东西!点赞!


2
我发现WebUpdate非常有用,尽管它是使用wxWidgets编写的。但是不用担心,它是一个独立的应用程序,可以处理您的更新。将其集成的步骤非常简单-只需编写两个XML文件并运行更新程序。而且,它是跨平台的。
它的优点在于它会自动下载、解压缩和安装所有所需的内容,而不仅仅提供一个弹出窗口,通知您有新的版本和下载链接。另一件你可以做的事情是定制化操作。
该项目的主页在这里,你可以阅读文档或查看官方教程

1
我建议您阅读有关插件的内容,以及如何创建和使用它们。如果您的应用程序架构是模块化的,并且可以分成不同的插件,请查看Google自动更新实用程序http://code.google.com/p/omaha/。我们正在使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接