自动更新Windows应用程序的最佳方法是什么?[关闭]


70

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


9
使其成为网络应用程序?:)
Michael Aaron Safyan 2011年

4
每5个小时运行一次更新代码吗?
米哈伊尔(Mikhail)

让我知道我是否错过了答案。
cosmin 2011年

Answers:


83

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

  1. 定期检查更新的更新程序应用程序。如果找到更新,则应自动安装。大多数商业设置创作工具都包含良好的更新程序应用程序。您可以尝试自己编写一个更新程序,但这并不像听起来那样简单。

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

需要按用户安装,因此您可以静默执行升级。如果按机器安装,则Windows的较新版本将显示提升提示,并且用户将不知道发生了什么。

更新器

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

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

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

要考虑的其他事项是:

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

更新

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

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

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

安装软件包还简化了Updater应用程序。使用这种类型的更新,更新程序仅需要检测可用的更新,下载并执行。

更新以两种方式起作用:

Windows Installer对它们两者都有很好的支持,因此您可以使用MSI软件包MSP补丁。它还支持静默安装,因此Updater所需要做的就是使用命令行参数执行软件包。

这些软件包还通过ALLUSERS属性支持按用户或按计算机安装。

更新分发

在确定更新程序和一些更新程序包之后,您还需要一种分发机制:

  • 一种通知更新程序可用更新的方法(例如,服务器上的更新信息文件)
  • 一种检测更新是否已安装的方法(因此仅安装一次)

所有这些都不是一件容易的事。这就是为什么许多产品使用第三方更新程序的原因。甚至某些商业设置创作工具都为您的软件包提供更新程序。

定制更新程序通常由拥有许多产品的大型公司使用,因为这对于他们来说是值得的投资。


10
一个评论:我建议避免使用持久性更新程序,而应使用任务计划程序定期运行它。
亚伦·克洛茨

很好的答案...但是跨平台需求呢?
男孩先生

通常,客户端更新程序应用程序是特定于平台的。因此,您需要为每个平台使用不同的更新程序。对于所有平台,服务器部分都是相同的。
cosmin 2011年

@CosminPirvu但是,msp过于棘手,无法可靠地使用,并且整个msi软件包(包括cab文件)通常太大而无法通过Web传递。因此,我认为以上建议的两种更新方法都不适合我。您如何看待?
上空

不幸的是,MSP修补程序是唯一的小型更新类型,可用于基于MSI的安装。它们仅适用于较小的更改(例如,几个文件)。但是,如果您不尝试在其中包含很多安装程序逻辑,它们就会起作用。另一种方法是创建自己的安装程序和更新。这通常不是一件容易的事。
cosmin

27

如果您希望具有完全相同的功能,则可以。Google已将其开源。

https://github.com/google/omaha


1
但是,似乎该项目不再更新了……
Bob Cromwell 2014年

这个项目有什么更新吗?我尝试使用此功能,但是它很难配置,看起来该项目已被Google终止。有什么见解吗?
Pritesh Acharya 2014年

最近看到了更多更新。它绝对不会停止。我认为Google只是内部开发它,并且“缓慢”地向公众发布了他们内部的内容。@PriteshAcharya我写了一个教程,应该可以简化
Michael Herrmann

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.