Releases: bluearchive-cafe/Cafe.Launcher.Avalonia_Release
Release list
v1.0.0-beta.8
v1.0.0-beta.8
本版本重点重构了首次启动体验(五步设置向导)、引入界面动效系统(过渡动画、系统动效偏好感知、覆盖层可取消退出)与 NSIS 安装器,新增磁盘空间预检查及底部状态信息显示模式切换,并全面优化了主界面状态层级、设置结构、本地化术语与构建质量。
本次更新新增了 7 项特性,优化了 7 项,修复了 12 个问题。
新增
-
首次启动设置向导:五步向导(语言选择 → 安装路径 → 下载源 → 代理配置 → 确认摘要),使用标准 RadioButton 选择下载源和代理,支持路径存在性检测与即时反馈、语言即时预览、导航标题换行、确认页编辑按钮返回修改以及退出确认拦截。
-
界面动效系统:主窗口新增
motion-overlay/motion-surface/motion-content/motion-bottom四层进入动画,由IsMotionEnabled与面板可见状态驱动。新增MotionVisibility控件感知系统动效偏好(窗口激活后延迟刷新,启动失败时保留已解析设置),用户可通过外观设置启用/禁用。覆盖层退出支持取消操作,防止过期任务隐藏当前覆盖层;Toast 退出统一手动/自动路径并精确识别取消来源。Toast 入场缓动由 Linear 改为 QuadraticEaseOut,新增 4px→0 滑入位移,时长从 350ms 缩短至 220ms。提取AnimationTimings工具类统一管理动画时长。 -
底部状态信息显示模式切换:新增不显示 / 简略(旧版样式)/ 详细(当前默认)三种模式,设置项位于外观分类。
-
主界面状态与操作层级强化:统一安装、进度与控制面板的状态布局,按操作类型显示对应进度图标(Sync / Update / CheckCircleOutline),优化路径安装、刷新、轮播和新闻交互。
-
设置与高级功能重组:设置分类收敛为五项(通用 / 外观 / 下载与网络 / 高级 / 关于)。高级分类新增日志文件操作(打开目录 / 清空日志)和诊断导出选项,日志查看器新增分页加载与搜索防抖。
-
全局字体按语言切换:移除 Inter 默认字体依赖,根据界面语言自动应用对应字体。
-
磁盘空间预检查与容量策略:全新安装前检查目标磁盘剩余空间,不足时禁用安装按钮并给出提示;统一容量策略。
优化
-
下载进度报告节流:使用
Stopwatch.GetTimestamp()将进度回调节流至 ~100ms,避免高速下载时 UI 线程过载。 -
LauncherSettings 深克隆性能:将 JSON 序列化往返的
DeepClone替换为复制构造函数,消除序列化开销。 -
游戏操作工作流边界拆分:拆分为
GameLaunchWorkflow/GameDownloadService/GameUninstallWorkflow,提取GameOperationStage等强类型契约。 -
文件下载参数收敛:提取
FileDownloadRequest/FileDownloadOperationControl模型,收敛参数传递。 -
颜色空间计算提取:约 200 行 HSV/HSL 转换逻辑从
SettingsAppearanceViewModel提取到ColorUtils工具类。 -
设计令牌提取:加载条尺寸、排版、动画时长等硬编码值提取为设计令牌。
-
本地化键命名全面规范化:按功能域统一前缀(
settingsGroup*、logLevel*、launcher*),去歧义合并重复键,清理 26 个未使用的本地化键。
修复
-
修复 Banner 图片加载失败:
RemoteHttpUrlValidator移除对 CGN、RFC 2544 等被 CDN 和代理软件实际使用的 RFC 保留地址段的拦截;ImageCacheService增加 User-Agent 头解决部分 CDN 拒绝无 UA 请求;修复远程背景相对路径到绝对 URL 的转换。 -
修复静默异常吞没:审计全部 115 个
catch块,为 8 个静默吞异常的位置添加Debug.WriteLine诊断输出。 -
修复设置界面视觉与布局:崩溃恢复对话框按钮高度统一(48→42),深色模式设置内容区背景与对话框统一(#202733→#161C26),ColorPicker 固定宽度 220,导航栏焦点指示条背景跟随自定义主题色,壁纸主题调色板完整显示。全部对话框操作按钮统一
LauncherControlHeightDialog高度,设置行正文保持可读宽度,Toast 关闭按钮补齐本地化提示。 -
修复轮播在刷新期间切换到加载中 Banner:防止远端内容轮播在数据刷新期间切换到临时占位卡片。
-
修复安装路径响应式布局:路径输入框宽度自适应及行内按钮响应式回归,将更改路径操作内嵌到路径字段并统一边缘留白。
-
修复 RemoteContentViewModel 重复释放 CTS:增加 disposed 防护。
-
修复设置字段序列化顺序:
SettingsEditor保持 JSON 字段写入顺序与已有格式一致。 -
修复向导细节:确认页编辑按钮正确返回对应步骤,语言切换后 UI 即时刷新。
-
修复资源面板状态异常:
ResourcePanelItem新增IsOperable属性,状态异常时禁用复选框和保存按钮。 -
修复构建与 CI:移除硬编码
RuntimeIdentifier,条件化OutputType=Exe,测试步骤改用隐式 restore 解决 RID 解析,Test-LocalizationContract.ps1兼容 Windows PowerShell 5.1,覆盖率阈值调整为 50% 并切换到coverlet.msbuild。 -
修复安装器卸载登记与彩蛋音频:清理失效的卸载注册表项,防止彩蛋音频播放异常导致崩溃。
-
修复
LauncherCoreService.LoadAsync同步调用:将.Result改为await避免潜在死锁。
v1.0.0-beta.7
v1.0.0-beta.7
本版本重点增强了诊断能力、网络弹性和代理支持。修复了 manifest 抓取密集重试轰击和下载状态持久化残留导致的无限循环问题,统一了远端 JSON 反序列化的错误上下文,新增代理"自动检测"模式作为默认值,并完善了汉化管理(资源面板)的 UID 来源管理与格式校验。
本次更新新增了 4 项特性,优化了 3 项,修复了 9 个问题。
新增
-
代理模式新增"自动检测"选项:新增
ProxyModes.Auto常量,作为代理设置的默认值(替代原先的Direct)。Auto 模式通过WebRequest.GetSystemWebProxy()自动检测系统代理配置——Windows 上读取 IE/Edge 代理设置,macOS 上读取系统代理,Linux 上读取环境变量。原有的Direct(直连)和System(手动配置系统代理)模式保持不变,三种模式按 Auto → Direct → System 顺序排列。对应新增proxyAuto本地化键(en: "Auto-detect"、zh-Hans: "跟随系统"、zh-Hant: "跟隨系統"、ja: "自動検出")。参见 dotnet HttpClient proxy 文档 了解 .NET 代理配置机制。 -
汉化管理(资源面板)UID 来源管理:新增
ResourcePanelUidSources常量和resourcePanelUidSource设置字段,支持在"自动检测"(从 cookie 或设置文件读取)和"自定义"(手动输入)之间切换 UID 来源。UI 新增 UID 展示/编辑卡片和来源 ComboBox(ToggleSwitch → CheckBox),支持编辑流程(BeginEdit / CancelEdit),自定义输入时先校验格式。 -
汉化管理 UID 格式校验:新增
ResourcePanelUidService.IsValidUid静态方法,校验 UID 格式为/^[A-Z]{8}$/(8 位大写字母)。ResolveUidAsync对 cookie 和 settings 读取的 UID 做格式校验,无效则视为空;SaveManualUidAsync拒绝无效格式并抛出ArgumentException。UI 层先校验再保存,失败时显示本地化错误提示(resourcePanelUidInvalidFormat键)。 -
汉化管理状态图标刷新:新增
ResourcePanelStatusToBrushConverter,根据加载 / 就绪 / 等待 / 失败状态动态映射图标颜色,替代原有的静态图标显示。
优化
-
远端 JSON 反序列化统一化:将
DeserializeJsonAsyncsniff helper 从LauncherApiClient提取到RemoteHttpRequestService,LauncherApiClient、LauncherUpdateService、ResourcePanelApiClient统一接入。所有远端 JSON 反序列化点现在都产出带 URL、HTTP 状态码、Content-Type 和字节预览的富错误信息,大幅提升网络故障的诊断效率。 -
HTTP 响应自动解压:
HttpClientFactory和ProxySettingsService创建的SocketsHttpHandler统一启用AutomaticDecompression = DecompressionMethods.All,透明解压 CDN 或代理返回的 gzip/deflate/Brotli 压缩响应。此前压缩响应无法被反序列化,产生不可诊断的ExpectedStartOfValueNotFound错误(如日志中出现的0x8Bgzip 魔数)。 -
汉化管理网络层重试退避:
ResourcePanelApiClient新增SendWithRetryAsync方法,实现 2 次重试 + 800ms × attempt 线性退避。仅在网络异常(HttpRequestException/TaskCanceledException)时重试,HTTP 非 2xx 不重试。三个端点(/status/list、/config/get、/config/set)全部接入,行为与 dashboard 项目fetchWithRetry保持一致。
修复
-
修复 manifest 抓取密集重试轰击:日志中 manifest 抓取出现 528 次连续失败,根因是 refresh → resume → fail 无限循环——
RunAsync在抓取 manifest 前保存DownloadTaskState,网络失败后未清除持久化状态,导致每次RefreshAsync都重新触发ResumePersistedDownloadAsync。修复方案:(1)GetRemoteManifestAsync改为 3 次有限重试 + 指数退避(500ms / 1000ms),对齐FileDownloadService的有限重试模式;(2)RunAsync网络失败时调用ClearDownloadState()打破循环。 -
修复 RunAsync 全部失败路径的持久化下载状态残留:
RunAsync在 manifest 抓取前调用SaveDownloadStateAsync,但原先仅网络失败路径清除了持久化状态。其余 7 条失败路径(游戏运行中、CDN 配置不完整、磁盘空间预检查失败、验证 3 次重试后仍失败、磁盘满 IOException、IO/权限异常、catch-all 意外异常)均未清除,均可能触发 refresh → resume → fail 循环。现已补全所有路径的ClearDownloadState()调用。DownloadTaskState仅存储元数据(版本/basis/路径/isRepair/patchUrlGroup),不存储下载进度,因此清除状态不丢失已下载文件。 -
修复远端 manifest 非 JSON 响应导致的不可诊断失败:此前
GetRemoteManifestAsync对非 JSON 响应仅抛出ExpectedStartOfValueNotFound异常,无 URL、HTTP 状态码、Content-Type 上下文。现在DeserializeRemoteJsonAsync缓冲响应体后反序列化,失败时抛出带完整上下文的JsonException(URL、状态码、Content-Type、前 16 字节十六进制/ASCII 预览、gzip/zlib/zstd/bzip2 魔数识别),配合AutomaticDecompression=All自动解压,彻底消除了此类不可诊断失败。 -
修复 ToastSeverityToBrushConverter 主题变体处理:改为使用
ActualThemeVariant替代ThemeVariant.Default,确保 Toast 图标颜色正确跟随当前应用主题(浅色/深色)。 -
修复 OnSelectedResourcePanelUidSourceChanged 无限递归:新增
isSettingUidSource守卫标志防止属性变更回调中的递归触发。 -
修复 SaveManualResourcePanelUid 并发加载:新增属性赋值守卫防止并发调用导致的竞态条件。
-
修复 ResourcePanelUidService 正则表达式性能:迁移至
[GeneratedRegex]源生成器,消除运行时正则编译开销。 -
修复设置归一化中代理默认值:
LauncherSettingsService和SettingsEditor的归一化逻辑将无效代理值回退为ProxyModes.Auto(此前回退为Direct),与LauncherSettings声明默认值保持一致。 -
修复
HttpClientFactory代理判断逻辑:CreateLeaseAsync中代理模式判断从!= System改为== Direct,使 Auto 模式正确走代理感知路径(通过ProxySettingsService.CreateHttpHandlerAsync创建带系统代理检测的 handler)。
v1.0.0-beta.6
v1.0.0-beta.6
本版本重点搭建质量基础设施并规范 UI 组件体系。新增 NSIS 安装程序与代码覆盖率门禁,提取通用设置行与对话框控件以消除重复 XAML,按语言自动切换系统字体与主题色方案,并新增繁体中文支持。
本次更新新增了 8 项特性,修复了 14 个问题。
新增
- NSIS 安装程序与发行打包:新增
installer/Cafe.Launcher.Avalonia.nsi安装脚本和scripts/Build-Distribution.ps1打包脚本,支持构建独立的 NSIS 安装程序(EXE)和便携 ZIP 包,安装路径为C:\Program Files\Cafe Launcher,升级时自动清理旧安装文件。 - 彩蛋:新增
EasterEggAudioService(基于 NAudio 的 Ogg Vorbis 音频播放)。在 ?? 月 ? 日当天,启动器标题会随机显示;在版本号区域连续点击 8 次可触发特殊音效。 - 按界面语言切换系统字体:新增
LanguageFontFamilyService,根据当前语言自动选择合适的系统字体——英文使用 Segoe UI、简体中文使用 Microsoft YaHei UI、繁体中文使用 Microsoft JhengHei UI、日文使用 Yu Gothic UI。窗口字体随语言切换实时更新。 - 繁体中文(zh-Hant)语言支持:新增 345 条繁体中文翻译,覆盖所有 UI 界面(设置分类、对话框、操作进度、系统状态等)。
- 代码覆盖率门禁:新增
coverage.ps1脚本和coverage.runsettings配置,在 CI 和本地验证中同时采集单元测试和 Headless UI 测试的覆盖率(XPlat Code Coverage / Cobertura 格式),合并报告并强制 70% 行覆盖与分支覆盖阈值。 - 可复用 UI 控件:提取三个通用控件以减少重复 XAML:
SettingRow— 统一设置行布局(图标 + 标题描述 + 操作控件插槽),所有设置分组改用此控件。ConfirmDialog— StyledProperty 驱动的确认对话框,替代 5 个重复的对话框 XAML 块(修复、卸载、停止、关闭、资源面板来源确认)。LoadingOverlay— 通用加载遮罩(不定进度条 + 标签文本),在 Banner 轮播和远程内容加载中复用。
- 设计令牌扩展:新增字体大小令牌(Xs 到 Display,共 10 级)、字重令牌(Normal / SemiBold)、等宽字体令牌(Consolas),以及控制高度令牌(Swatch、Chip、Field、DialogTitle)。
- 设置分类导航提示:设置导航栏各分类项新增
ToolTip显示分类描述文本。
优化
- 设置结构精简:移除"通知与内容"和"高级"两个设置分类,将通知开关和远程内容卡片设置并入"外观"分类,高级诊断功能通过日志查看器直接访问。设置导航从 7 项缩减为 5 项(一般 / 游戏 / 下载与网络 / 外观 / 关于)。
- 对话框操作按钮规范化:所有对话框按钮统一使用
dialog-action样式类和LauncherControlHeightDialog(42px)高度;移除按钮内容中的硬编码Foreground属性,由按钮父级样式统一控制。 - 主题色系统全面动态化:
LauncherAccentSoftBrush、LauncherAccentBorderBrush、LauncherFocusRingBrush、LauncherCarouselDotActiveBrush全部改为跟随SystemAccentColor,配合自定义主题色模式实现完整换肤。 - 状态摘要布局统一:设置页状态摘要行改为单行横向排列(标题 + 版本 + 网络状态 + 磁盘空间),移除了独立的操作备注行。
- 本地化键名规范化:全面重命名本地化键以确保命名一致性和可发现性(如
loadingTitle→launcherLoadingTitle、loadingValue→launcherLoadingValue、installPathNotConfigured→gameInstallPathNotConfigured),并清理 20+ 个未使用的键。 - 静默异常诊断增强:在
SettingsViewModel中为设置保存、游戏路径更新、外观预览、日志级别应用等关键 catch 块增加了Debug.WriteLine诊断输出,避免异常被静默吞没。 - 单元测试框架升级:单元测试项目从 xUnit v2(2.9.3)迁移至 xUnit v3(3.2.2),移除
Xunit.SkippableFact依赖,更新Microsoft.NET.Test.Sdk至 18.7.0。
依赖变更
| 包 | 旧版本 | 新版本 |
|---|---|---|
| Avalonia(全套) | 12.0.4 | 12.0.5 |
| Serilog | 4.2.0 | 4.3.1 |
| Serilog.Sinks.File | 6.0.0 | 7.0.0 |
| Microsoft.Extensions.DependencyInjection | 10.0.0 | 10.0.9 |
| AvaloniaUI.DiagnosticsSupport | 2.2.2 | 2.2.3 |
| NAudio | — | 2.3.0(新增) |
| NAudio.Vorbis.Latest | — | 1.6.0(新增) |
| Avalonia.Fonts.Inter | 12.0.4 | 已移除 |
修复
- 修复远程背景图片因 API 返回相对路径而无法加载的问题(
LauncherApiClient现在对/prod/BlueArchive_JP/launcher_background_img/前缀的相对路径自动拼接完整 URL)。 - 修复 Banner 图片因 SSRF 校验和缺少 User-Agent 请求头导致加载失败的问题。
- 修复
RemoteHttpUrlValidator私有地址检测范围过宽的问题——移除对100.64.0.0/10(CGNAT)、198.18.0.0/15(基准测试)、198.51.100.0/24(文档示例)、203.0.113.0/24(文档示例)的拦截,仅保留真正不可路由的私有地址。 - 修复
RemoteHttpUrlValidator在 URL 解析失败时提供诊断详情(包含被拦截的具体 IP 地址信息)。 - 修复
LocalizationService在多测试并行执行时的竞态条件。 - 修复
GameDownloadService中.tmp临时文件扩展名的魔术字符串问题,提取为TempFileExtension常量。 - 修复
LauncherApiClient、GameDownloadService等IDisposable实现未调用GC.SuppressFinalize的问题。 - 修复资源管理对话框(汉化管理界面)尺寸因本地化文本长度变化导致的布局问题,面板改用固定尺寸(720×592)。
- 修复设置导航栏选中项背景色不跟随自定义主题色的问题。
- 修复壁纸主题调色板显示不完整的问题。
- 修复未安装游戏时点击不可用操作缺少提示的问题。
- 修复确认对话框宽度过宽的问题,添加
MaxWidth限制。 - 修复
EasterEggAudioService中的ObjectDisposedException传播问题,添加线程安全的释放守卫。 - 修复安装程序卸载时对废弃注册清理的遗漏。
v1.0.0-beta.5
v1.0.0-beta.5
重构了设置页面为侧边栏分类导航,新增动态效果偏好与主题色规范化算法,增强下载过程反馈与代理兼容性,ViewModel 通信从委托迁移为事件模式,并移除了首次启动迁移向导。
新功能
动态效果偏好设置
- 新增「动态效果」设置项(系统跟随 / 完整动画 / 减弱动态效果)
- 「系统跟随」模式自动读取 Windows 系统动画设置(辅助功能 → 显示动画)
- 减弱动态效果时,轮播横幅自动暂停播放,且切换动画变为即时切换(无过渡效果)
- 按钮等控件改用 MinHeight 替代固定 Height,支持文本换行时自动增高
设置页面信息架构重构
- 设置对话框改为侧边栏导航布局:左侧 7 个分类标签,右侧对应内容区
- 7 个分类:常规 / 游戏 / 下载与网络 / 外观 / 通知与内容 / 高级 / 关于
- 选中的分类以左侧 3px 主题色竖线指示,悬停时文字变为主题色
- 每个分类右侧顶部显示启动器状态摘要(版本号、网络状态、磁盘空间)
- 对话框尺寸从 760×592 调整为 960×620,容纳更丰富的布局
下载过程反馈增强
- 下载前新增磁盘空间检查阶段,实时显示所需空间和可用空间
- 磁盘空间不足时,提示信息显示具体数值(需要 / 可用)
- 下载校验失败后显示重试进度(当前重试次数 / 上限、失败文件数)
- 校验彻底失败时显示失败文件数量
改进
主题色品质提升
- 新增主题色规范化算法:自动确保提取的主题色具有足够饱和度(≥22%)和明度(≥30%),并限制相对亮度不超过 32%,避免出现过淡或过亮的主题色
网络与代理修复
- 修复代理绕过列表(NO_PROXY)中包含通配符域名(如 *.zhihu.com)导致 RegexParseException 崩溃的问题 —— 正确处理 shell 通配符到 .NET 正则的转义
<local>标记现在正确映射到 BypassProxyOnLocal,不再被当作域名模式- SSRF 验证支持代理模式:当连接通过代理时跳过本地 DNS 解析(避免内网 DNS 误拦截代理请求)
文件下载容错性
- 文件下载过程中出现网络错误(HttpRequestException / IOException)时保留临时文件,不做删除,提升断点续传的可靠性
- CRC64 校验失败等数据完整性错误仍会清理临时文件
代码架构重构
- ViewModel 间通信从委托模式迁移为事件模式:GameOperationsViewModel、WindowChromeViewModel、ResourcePanelViewModel 不再依赖父级注入的 Func<>/Action<> 委托,改用 .NET 原生事件,代码更简洁、生命周期更安全
- MainWindow.axaml.cs 在 OnClosed 时取消订阅所有 ViewModel 事件,防止内存泄漏
UI 细节优化
- 远端内容面板各区块间距加大,视觉呼吸感更强
- 设置底部按钮样式统一为对话按钮规格
- 内容行内边距从 8 增加到 12
- 新增 LauncherThickness* 设计标记(Sm/Md/Lg)用于统一内边距
- Light 主题信息提示背景色微调(更饱满的蓝色)
日志查看器
- 会话边界条目("Session started" / "Session ended")现在显示在日志查看器中
移除
首次启动迁移向导
- 完全移除 v1.0.0-beta.4 中引入的原版启动器设置迁移向导
- 移除的服务:OldLauncherDetectionService、OriginalLauncherMigrationService、LevelDbReader
- 移除的视图模型与界面:MigrationWizardViewModel、迁移向导对话框
- 移除的设置字段:hasCompletedFirstLaunchWizard
- 首次运行时不再自动检测原版启动器;用户直接进入主界面手动设置
测试与构建
- 新增 verify.ps1 一键验证脚本(Debug 构建 → 单元测试 → 无头测试 → Release 构建)
- DiskSpaceService 支持依赖注入测试桩
- 新增测试覆盖:动态效果、设置分类、代理正则、远端内容、窗口交互等
- 移除迁移相关测试
v1.0.0-beta.4
v1.0.0-beta.4
本版本重点修复与官方启动器共用同一游戏目录时的兼容性问题,并恢复窗口最小尺寸限制。
修复与改进
- 与官方启动器共用兼容性(重要) — 修正本地
manifest.json文件项vc完整性哈希的字段顺序为path, hash, size,与官方启动器一致。此前按错误顺序计算vc,导致用官方启动器修复或安装后,重写版会把整份清单判为「损坏」、误入修复界面,却又提示「没有需要修复的文件」,形成死循环。 - 启动校验放行(fail-open) —
remoteManifest启动校验模式下,当无法获取远程清单(地址为空、网络失败,或服务端换包后旧版本清单被下架)时改为放行启动,与官方行为一致,消除「启动被拦截 ↔ 无文件可修复」的死锁。 - 默认游戏路径对齐官方 — 默认安装路径改为启动器自身目录下的
YostarGames\BlueArchive_JP(对齐官方dirname(exe)),避免两个启动器把游戏安装到不同位置。 - 卸载清理残留 — 卸载完成后顺带删除位于
%LOCALAPPDATA%\Cafe Launcher\的download_state.json续传标记,不再残留陈旧状态。
界面优化
- 窗口最小尺寸限制 — 为可调整大小的主窗口恢复
1024×640最小尺寸(保留可缩放,初始尺寸仍为 1300×754),避免窗口被缩到布局不可用;窗口大小/位置不跨会话持久化。
技术变更(面向开发者)
- 共用兼容契约文档化与守卫 — 在
CLAUDE.md/AGENTS.md记录ManifestFile字段顺序 wire 契约、OfficialHashService三类vc(清单文件path, hash, size/清单信息name, version, basis/游戏配置tag, name, params, version)的字段顺序、启动校验 fail-open 与默认路径对齐;新增OfficialHashServiceTests,以官方启动器真实产出的vc值作跨启动器兼容回归守卫。 - 清理无用本地化键 — 移除启动校验改为 fail-open 后不再引用的
remoteManifestUrlRequestFailed/remoteManifestUrlEmpty/remoteManifestDownloadFailed本地化键。 - 测试大幅补充 — 新增 Avalonia Headless 与平台行为测试、ViewModel 交互状态与命令测试、远程资源与网络安全测试、游戏安装/更新/修复测试,以及窗口缩放与最小尺寸契约测试。
v1.0.0-beta.3
v1.0.0-beta.3
本版本重点强化安全防护、完善日志系统并提升界面可访问性。
新增功能
- SSRF 防护 — 所有对外 HTTP 请求经
RemoteHttpUrlValidator校验,仅允许指向公网地址(拦截 localhost、私有 IP、保留 IP 段);重定向由RemoteHttpRequestService手动管理(限制 5 次),每步验证重定向目标 URL,拦截 HTTPS→HTTP 降级攻击。 - 游戏路径符号链接防护 —
GetSafePath遍历目标路径的每个已存在组件,检测FileAttributes.ReparsePoint(符号链接 / Junction),防止通过文件系统重解析点将文件写出游戏目录。 - 统一日志与崩溃恢复 — 底层日志引擎替换为 Serilog(异步接收器,10000 条缓冲,5 MB 滚动文件,保留 3 个),全局注入版本号与 CommitSha 信息,通过
session.active文件标记检测上次会话崩溃。 - 运行时日志级别切换 — 支持通过
LoggingLevelSwitch在运行时动态调整日志级别(Debug 默认 Verbose,Release 默认 Information)。 - 游戏路径自动补全 — 选择游戏路径后自动追加
YostarGames/BlueArchive_JP子目录,并提供「检测」按钮。
修复与改进
- 下载恢复强化 — 严格校验 Content-Range 响应头(起点偏移量、长度一致性);临时文件超过预期大小时自动删除重建;服务端忽略 Range 请求时回退为完整下载。
- 系统托盘降级 —
SystemTrayService.Initialize()初始化失败时自动释放资源并返回false,不影响主窗口正常启动。 - 日志查看器修复 — 修复 Serilog 文件锁导致日志查看器无法读取日志,以及活动文本日志读取失败的问题。
- URL 改写精确匹配 — 补丁 URL 改写改用
Uri.Host精确匹配,避免主机名出现在路径或查询参数中时被误改写。 - 界面状态修复 — 修复未安装状态下底部面板更改游戏路径后显示不更新。
- 多用户支持 —
Mutex和EventWaitHandle从Global改为Local作用域,允许多用户同时运行启动器。 - 代码稳健性 — 消除空
catch块,补全ConfigureAwait(false),限制非就绪状态卸载,统一末尾目录分隔符。
界面优化
- 窗口可调整大小 — 启用
CanResize="True",移除最小宽度/高度限制。 - 无障碍访问 — 所有仅有图标的按钮添加
AutomationProperties.Name,屏幕阅读器可正确读出按钮功能。 - 叠加层焦点管理 — 新增
OverlayFocusBehavior:叠加层(设置/对话框)显示时自动聚焦第一个可聚焦控件;叠加层关闭时恢复之前的键盘焦点;设置和对话框叠加层启用TabNavigation="Cycle"循环导航。 - Banner 轮播 — 左右翻页按钮添加工具提示与无障碍名称(中/日/英三语);刷新远端内容时自动停止并重置轮播定时器。
技术变更(面向开发者)
- 日志引擎重构 — 从自研写入器迁移至 Serilog,异步管道单例化并共享给 DI 容器和崩溃处理。
- 深层模块提取 — 提取
IFileDownloadService、RemoteManifestService、WindowEscapeStrategy、ResourcePanelService等深模块,减少接口表面积。 - 本地安装状态重构 — 集中安装状态读写,接入统一运行状态,提取游戏安装路径模块并显式注入。
- 设置模块简化 — 内联
SettingsNormalizer消除浅层 seam。 - 基础设施 — 集中
JsonSerializerOptions严格配置,增强VersionComparer,引入GameDownloadService.Dependencies记录类型集中依赖管理。 - CI — 引入 NuGet 缓存,移除构建产物的 Artifact 上传。
- 测试补充 — 新增本地安装状态、下载恢复边界情况、SSRF URL 验证、Banner 轮播状态、符号链接防护、UI 样式契约等测试。
v1.0.0-beta.2
v1.0.0-beta.1
What's Changed
Features
- 完善检查更新逻辑 (0dadf1f)
- 使用 GitHub Releases 检查更新并同步发布 (d538991)
- 添加旧版启动器配置迁移向导 (f921f1e)
- 添加旧版启动器配置迁移向导 (1f1bb56)
- 壁纸契合度设置与自适应背景填充色 (4836dc8)
- 首次启动时从原版启动器迁移游戏安装路径 (f8166c3)
- 资源面板 Cafe 源引导、UID 输入框样式、网络状态栏显示 (48a4748)
- 迁移至 Microsoft.Extensions.DependencyInjection (17db9a2)
- 原生集成资源控制面板 (dae065b)
- 添加 BestHTTP Cookie Library 解析服务 (f4900cc)
- 添加主题色自定义功能,支持从壁纸提取配色 (4303327)
- 完善下载源切换修复引导与下载状态恢复 (3305acd)
- 支持从文件夹随机选择自定义壁纸 (33b4db8)
- 实现主窗口 MVVM 界面——设置面板、确认对话框、轮播、Toast (d4a4049)
- 实现全部服务层——API 通信、游戏下载、启动、卸载与本地化 (71cf80f)
- 初始化 Avalonia 项目结构和核心数据模型 (105a8cc)
Bug Fixes
- 修复 Test 用例的问题,添加 GitHub PAT (8bef4ad)
- 修复 LauncherVersion 测试因版本号变更导致的断言失败 (742e9a8)
- 修复 Release 发布问题 (428e41e)
- 统一 Release 逻辑 (ba606e9)
- 修复语言 en 的错误转义问题 (7b61474)
- 修复选择游戏目录后误报未保存更改 (6090715)
- 修复全局审查发现的可靠性与工程质量问题 (0138407)
- 修复代码审计发现的 22 项问题(竞态条件、空引用、双重释放、防御性编码、性能优化) (3965c2a)
- 修复设置下拉框没有与设置项居中的问题 (0f58bf9)
- 修复 Banner 加载失败占位符未填满整张卡片 (a838067)
- Toast 样式优化 * 添加了淡入动画、关闭按钮、主题感知图标颜色和可读性更好的文字颜色。 (c7cb962)
- 修复 CRC64 校验时的文件共享冲突导致下载重试提前退出 (8c9a96d)
- 修复初始化界面时无条件将
IsSettingsDirty设置为 true 的问题 (df9cd5b) - 修复 CDN 重试优先级颠倒及本地清单完整性校验 (e8b4cbf)
- 修复随机背景保存时壁纸多次更新 (45e5b33)
- 修复壁纸取色色板打开设置后回退 (c02e33c)
- 整合资源面板与界面显示修复 (7f2ded9)
- 修复壁纸色板显示不完整 (df78e05)
- 优化中文法律信息文案 (6787cf8)
- 修复启动器交互与下载重试问题 (c4659a0)
- 修复启动器网络与下载可靠性问题 (648d440)
- 统一主题色界面表现 (b597e32)
- 修复代码库安全性和可靠性问题 (361d0dd)
- 修复 dotnet restore 不支持 -c 简写的问题 (5ba636d)
Refactoring
- 完善 UI 设计令牌与状态信息展示 (b99bec3)
- 统一 UI 样式(边距、圆角、图标、配色、设计令牌) (cb3769c)
- ProcessService.IsExeRunningAsync 移除 tasklist 调用,改用 .NET 原生 Process.GetProcessesByName (dfd56e6)
- 统一命名规范 — 常量、字段、方法、事件、本地化键名 (851de77)
- 重构 OriginalLauncherMigrationService 跨平台支持并消除重复逻辑 (83d68f0)
- 版本信息 chip 拆分为独立字段并标注名称 (0ffa138)
- 拆分主窗口视图模型职责 (1e9322c)
- 全面修复安全、可维护性和 UI/UX 问题 (456a9b5)
- 将 MainWindowViewModel 拆分为三个职责明确的 ViewModel (4b27039)
- 修复安全性、消除代码重复、改善 UX 与可观测性 (04df13c)