我喜欢能够在没有用户任何努力的情况下更新自己的应用程序(想想:适用于Mac的Sparkle框架).在Qt应用程序中是否可以使用任何代码/库来执行此操作,而不必担心操作系统的详细信息?
至少对于Windows,Mac和用户拥有的Linux二进制文件.
我可以在Mac版本上集成Sparkle,为Linux案例编写代码(仅用于独立的,用户拥有的二进制文件; 如果我的程序打包,我不会搞乱分发包装),并找人帮助我Windows方面,但这非常痛苦.
它不是一个完整的解决方案,但可以通过https://github.com/mendeley/Update-Installer获得用于创建自动更新和安装包的跨平台(Windows,Mac,Linux)工具.此工具不处理发布更新或下载它们.
这是为了与基于Qt的应用程序一起使用,但为了使更新安装程序小巧,独立且易于构建,安装程序仅使用标准系统库(Linux/Mac上的C++运行时,pthreads/libz/libbz2,Windows上的Win32 API) ,Mac上的Cocoa,Linux上的后备版GTK.这简化了交付更新,包括新版本的Qt和您的应用程序可能依赖的其他非系统库.
在考虑这个之前,我会建议:
如果您只为两个平台构建,请考虑为这些平台使用标准且经过良好测试的自动更新框架 - 例如.Sparkle
在Mac上,Google's Omaha
在Windows上或内置于流行安装框架中的自动更新系统(例如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中),则当updater尝试获取写入安装目录的权限时,用户将看到可怕的UAC提示.这可以通过安装到用户可写目录(我认为这是谷歌Chrome的功能)或获取Authenticode证书并使用它来签署更新程序二进制文件来避免.
在Windows Vista/7上,如果正在使用,则无法删除应用程序.exe或DLL,但更新程序可以将现有的.exe/DLL移到临时目录中,并在下次重新启动时将其安排删除.
在Ubuntu上,第三方存储库在分发更新后被禁用.Google通过创建一个cron-job来解决这个问题,以便在必要时重新添加存储库.
无耻的插件:Fervor,一个简单的多平台(基于Qt)应用程序autoupdater灵感来自Sparkle.
无耻的插件:这是一个相对古老的问题,但我认为提到我最近创建的一个库可能是有用的,我将其命名为"QSimpleUpdater".除了通知您是否有更新版本之外,它还允许您以任何格式(例如HTML或RTF)下载更改日志,并使用对话框直接从您的应用程序下载更新.
正如您对Qt项目所期望的那样,它适用于Qt支持的任何平台(在Windows,Mac和Linux上测试).
链接:
网站
GitHub存储库
截图: