什么是自动更新Windows应用程序的最佳方式?

Google Chrome 每五小时自动更新一次 。 我想在我自己的应用程序中克隆这个确切的function。 什么是在Windows上实现此function的最佳方法?

要复制此更新行为,您需要两件事情:

  1. 定期检查更新的更新程序应用程序。 如果find更新,它应该自动安装。 大多数商业设置创作工具包括良好的更新应用程序。 你可以尝试自己编写更新程序,但并不像听起来那么简单。

  2. 每个用户安装每个产品版本。 每个用户安装只将数据写入用户configuration文件文件夹(AppData,漫游文件夹等)和HKEY_CURRENT_USER。 没有程序文件或HKEY_LOCAL_MACHINE。

每用户安装都是必需的,所以您可以静默地执行升级。 如果安装是每台计算机,较新的Windows版本将显示提升提示,用户将不知道发生了什么。

更新程序

一些更新者使用服务。 对于自动更新,这不是真正的解决scheme,因为服务安装需要pipe理员权限。 因此,您的安装过程和后续更新将显示提升提示。

另一种方法是使用每个用户的更新程序应用程序。 它不需要任何提升,可以安装在应用程序文件夹中。 这种types的更新程序既可以作为计划任务运行,也可以从应用程序中运行(在应用程序启动时执行)。

在这两种情况下,您需要考虑更新程序可能需要自行更新。 因此,执行更新的过程必须是临时过程(例如,更新程序应用程序的临时副本)。 它也应该没有提升运行。 这就是为什么服务不是一个好主意。 在更新之前,它需要自行停止,使用处理更新的临时进程,并在完成时再次启动。

其他要考虑的事情是:

  • 权限问题(如果更新过程需要任何权限或提升)
  • 下载位置
  • 更新检测机制(更新程序如何检测是否应该安装新版本)

更新

一个常见的误解是更新应该是应用程序文件(如主应用程序EXE)。 这种情况很less出现,因为更新可能需要覆盖的不仅仅是一个文件。

大多数更新是安装包(例如MSI)或补丁(MSP)。 这是最好的方法,因为它们处理整个更新逻辑:

  • 检测运行中的应用
  • 更新资源
  • 更新产品信息(控制面板中的快捷方式,程序和function小程序等)

安装包也简化了Updater应用程序。 使用这种types的更新,更新器只需要检测可用的更新,下载并执行它们。

更新有两种方式:

  • 主要升级 :旧版本在新版本安装之前完全卸载
  • 次要升级 :旧版本被修补

Windows Installer对它们都有很好的支持,所以你可以使用MSI包和MSP补丁 。 它也支持无提示安装,因此您的所有Updater需要执行的是使用命令行参数执行包。

这些软件包还支持通过ALLUSERS属性的每个用户或每个机器的安装。

更新分配

在决定更新程序和某些更新程序包之后,还需要一个分发机制:

  • 一种通知更新程序更新可用的方法(例如,服务器上的更新信息文件)
  • 一种方法来检测是否安装更新(所以它只安装一次)

所有这一切都不是很容易。 这就是为什么很多产品使用第三方更新器。 即使一些商业设置创作工具为您的包提供更新。

自定义更新程序主要用于拥有大量产品的大型公司,因为投资对他们来说是值得的。

如果你想有完全相同的function,你可以。 Google已经开源了。

https://github.com/google/omaha

试试winsparkle – https://github.com/vslavik/winsparkle 。 这是一个C ++库。