autoUpdater¶
允许应用自动更新自身。
进程:主进程
另请参阅:关于如何在应用中实现更新的详细指南。
autoUpdater 是一个 EventEmitter。
平台说明¶
目前,仅支持 macOS 和 Windows。Linux 上没有内置的自动更新支持,因此建议使用发行版的包管理器来更新你的应用。
此外,各平台存在一些细微差异:
macOS¶
在 macOS 上,autoUpdater 模块基于 Squirrel.Mac 构建,这意味着你无需任何特殊配置即可使其工作。对于服务器端要求,你可以阅读 服务器支持。请注意,App Transport Security(ATS)适用于更新过程中发出的所有请求。需要禁用 ATS 的应用可以在其应用的 plist 中添加 NSAllowsArbitraryLoads 键。
[!IMPORTANT] 你的应用必须经过签名,才能在 macOS 上自动更新。这是
Squirrel.Mac的要求。
更新 ZIP 会流式写入磁盘,而不是保存在内存中。当服务器以 ETag 或 Last-Modified 头响应并支持 Range 请求时,因网络变化、休眠或应用退出而中断的下载,会在下次更新检查时从停止处继续,包括重新启动后;否则它会重新开始。更新条目(更新服务器的响应,或 serverType: 'json' 源中的 updateTo 对象)可以在 url 旁边声明 sha256(十六进制摘要)和 size(字节);不匹配的下载会在解包前被丢弃,并触发 error。
更新条目还可以携带 delta,这是一个包含 from_version、url、sha256 和 size 的对象,提供来自某个较早构建的二进制补丁。当 from_version 等于正在运行的应用的 CFBundleVersion 时,将下载该补丁而不是 ZIP,将其应用到正在运行的应用副本,并且结果会经过与解包 ZIP 相同的代码签名验证;如果任何步骤失败,则会在同一次检查中下载 ZIP。补丁使用 Sparkle 的 BinaryDelta create 从实际发布的 bundle 生成;有关约束条件,请参阅 Squirrel.Mac 的 README。
Windows¶
在 Windows 上,autoUpdater 模块会根据应用的打包方式自动选择适当的更新机制:
- MSIX 包:如果你的应用作为 MSIX 包运行(使用 electron-windows-msix 创建,并通过
process.windowsStore检测),该模块将使用 MSIX 更新器,它支持直接的 MSIX 文件链接和 JSON 更新源。 - Squirrel.Windows:对于通过传统安装程序安装的应用(使用 electron-winstaller 或 Electron Forge 的 Squirrel.Windows maker 创建),该模块使用 Squirrel.Windows 进行更新。
你无需配置使用哪个更新器;Electron 会自动检测打包格式并使用相应的更新器。
Squirrel.Windows¶
使用 Squirrel.Windows 构建的应用会触发自定义启动事件,你的 Electron 应用必须处理这些事件,以确保正确初始化和清理。
Squirrel.Windows 应用会在安装后立即以 --squirrel-firstrun 参数启动。在此期间,Squirrel.Windows 会对你的应用获取文件锁,在锁释放之前,autoUpdater 请求将会失败。实际上,这意味着在首次启动后的最初几秒内,你将无法检查更新。你可以通过在 process.argv 包含 --squirrel-firstrun 标志时不检查更新,或为更新检查设置 10 秒超时来规避此问题(更多信息见 electron/electron#7155)。
使用 Squirrel.Windows 生成的安装程序会创建一个带有应用程序用户模型 ID的快捷方式图标,其格式为 com.squirrel.PACKAGE_ID.YOUR_EXE_WITHOUT_DOT_EXE,示例为 com.squirrel.slack.Slack 和 com.squirrel.code.Code。你必须使用 app.setAppUserModelId API 为你的应用设置相同的 ID,否则 Windows 将无法在任务栏中正确固定你的应用。
MSIX 包¶
当你的应用打包为 MSIX 时,autoUpdater 模块提供额外功能:
- 在
setFeedURL()中使用allowAnyVersion选项,以允许更新到旧版本(降级) - 支持直接的 MSIX 文件链接或 JSON 更新源(类似于 Squirrel.Mac 格式)
事件¶
autoUpdater 对象会发出以下事件:
事件:'error'¶
返回:
errorError
在更新过程中发生错误时发出。
事件:'checking-for-update'¶
在开始检查可用更新时发出。
事件:'update-available'¶
当有可用更新时发出。更新会自动下载。
事件:'update-not-available'¶
当没有可用更新时发出。
事件:'update-downloaded'¶
返回:
eventEventreleaseNotesstringreleaseNamestringreleaseDateDateupdateURLstring
当更新已下载时发出。
在 Squirrel.Windows 中,只有 releaseName 可用。
[!NOTE] 严格来说,无需处理此事件。成功下载的更新仍会在应用下次启动时应用。
事件:'before-quit-for-update'¶
options对象url字符串 - 更新服务器 URL。对于 Windows MSIX,这可以是 MSIX 文件的直接链接(例如https://example.com/update.msix),也可以是返回更新信息的 JSON 端点(更多信息请参见 Squirrel.Mac README)。headersRecord\<string, string>(可选) macOS - HTTP 请求头。serverType字符串(可选) macOS - 可以是json或default,更多信息请参见 Squirrel.Mac README。allowAnyVersion布尔值(可选) Windows - 如果为true,则允许 MSIX 包降级到旧版本。 默认为false。
设置 url 并初始化自动更新器。
autoUpdater.getFeedURL()¶
返回 string - 当前更新源 URL。
autoUpdater.checkForUpdates()¶
询问服务器是否有更新。在使用此 API 之前,必须调用 setFeedURL。
[!NOTE] 如果有可用更新,它将被自动下载。 两次调用
autoUpdater.checkForUpdates()会下载两次更新。
autoUpdater.quitAndInstall()¶
在更新下载完成后,重启应用并安装更新。
它只应在 update-downloaded 发出后调用。
在内部,调用 autoUpdater.quitAndInstall() 会先关闭所有应用窗口,并在所有窗口关闭后自动调用 app.quit()。
[!NOTE] 严格来说,调用此函数并非应用更新所必需, 因为成功下载的更新总会在应用下次启动时应用。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron