菜单

更新系统

相关源文件

目的与范围

Shadowsocks Windows 中的更新系统负责检查、通知和促进应用程序新版本的安装。它会定期检查 GitHub 的新版本发布,比较版本号,并为用户提供下载更新或跳过特定版本的选项。

本文档涵盖了更新检查流程、用户界面和安装机制。有关存储更新偏好的配置系统的更多信息,请参阅 配置系统

组件概览

更新系统主要实现在 UpdateChecker 类中,该类与 Shadowsocks 架构中的其他组件集成,提供版本更新功能。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs19-176

更新检查流程

更新检查流程涉及连接到 GitHub API、检索发布信息、比较版本号以及通知用户可用更新。

此过程的核心是 CheckForVersionUpdate 方法,该方法会

  1. 检索最新的配置以检查用户偏好
  2. 查询 GitHub API 以获取发布信息
  3. 解析响应并比较版本
  4. 如果存在更新版本,则显示提示

当前版本在 UpdateChecker 类中定义为一个常量

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs52-90 shadowsocks-csharp/Controller/Service/UpdateChecker.cs36

版本比较逻辑

更新系统使用 .NET 内置的 Version 类来比较版本。如果满足以下条件,则认为一个版本是较新的版本:

  1. 发布版本大于当前版本
  2. 该发布版本未标记为预发布版本,或者
  3. 该发布版本已标记为预发布版本,但用户已选择检查预发布版本

此外,系统还会跳过与用户“跳过的更新版本”偏好设置相符的发布版本。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs69-74

更新用户界面

当存在新版本时,系统会使用 VersionUpdatePromptView 类显示一个提示。此窗口提供有关发布版本的信息,并向用户提供选项。

用户选项

  1. 下载更新 - 启动新版本的下载
  2. 跳过此版本 - 在配置中将此版本标记为已跳过
  3. 关闭 - 忽略提示,不执行任何操作

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs96-113

更新安装流程

与某些应用程序自动更新不同,Shadowsocks Windows 采用半自动化方法。

当用户选择更新时

  1. DoUpdate 方法会下载所选版本的所有资产。
  2. 文件使用 Utils.GetTempPath() 保存到临时目录。
  3. 系统会专门跟踪 .zip 文件。
  4. 下载完成后,Windows 资源管理器将打开并显示下载的文件。
  5. 用户需要手动提取和安装更新。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs124-150

跳过更新功能

用户可以选择跳过特定的更新版本。此信息会存储在配置中,以防止再次提供相同的更新。

当用户跳过更新时

  1. 将调用 SkipUpdate 方法。
  2. 版本将存储在配置的 skippedUpdateVersion 属性中。
  3. 通过 ShadowsocksController.SaveSkippedUpdateVerion 保存配置。
  4. 更新提示窗口将被关闭。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs156-163

更新系统集成

更新系统通过 ShadowsocksController 集成到应用程序生命周期中,该控制器在适当的时候启动更新检查。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs19-176

发布历史管理

应用程序的版本历史记录在 CHANGES 文件中跟踪,该文件记录了每个版本的特性、错误修复和改进。当前版本(截至文档)为 4.4.1.0,发布于 2022 年 2 月 8 日。

此历史记录对于用户了解版本之间的变更以及更新中可用的新特性或修复非常重要。

来源: CHANGES1-446

技术实现细节

版本定义

当前版本在多个地方定义以保持一致性:

  • UpdateChecker.cs 中作为常量。
  • AssemblyInfo.cs 中(引用了 UpdateChecker 常量)。
  • appveyor.yml 中用于构建系统。

这确保了版本在整个应用程序和构建过程中保持一致。

// In UpdateChecker.cs
public const string Version = "4.4.1.0";

// In AssemblyInfo.cs
[assembly: AssemblyVersion(UpdateChecker.Version)]

// In appveyor.yml
version: 4.4.1.{build}

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs36 shadowsocks-csharp/Properties/AssemblyInfo.cs36 appveyor.yml14

HTTP 客户端使用

更新系统使用由 ShadowsocksController 提供的 HttpClient 实例来向 GitHub API 发起请求。此客户端已配置适当的头部和设置,以便与 GitHub 进行通信。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs41-42

配置选项

更新系统在 Configuration 对象中存储了两个主要的配置选项:

选项类型目的
checkPreRelease布尔值控制在检查更新时是否包含预发布版本。
skippedUpdateVersion字符串存储用户选择跳过的版本。

这些选项通过配置系统进行管理,并在应用程序会话之间持久化。

来源: shadowsocks-csharp/Controller/Service/UpdateChecker.cs27-28 shadowsocks-csharp/Controller/Service/UpdateChecker.cs71-74