Skip to content

Releases: bluearchive-cafe/Cafe.Launcher.Avalonia_Release

v1.0.0-beta.8

v1.0.0-beta.8 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 19 Jul 14:28

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 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 09 Jul 00:40
c482221

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 反序列化统一化:将 DeserializeJsonAsync sniff helper 从 LauncherApiClient 提取到 RemoteHttpRequestServiceLauncherApiClientLauncherUpdateServiceResourcePanelApiClient 统一接入。所有远端 JSON 反序列化点现在都产出带 URL、HTTP 状态码、Content-Type 和字节预览的富错误信息,大幅提升网络故障的诊断效率。

  • HTTP 响应自动解压HttpClientFactoryProxySettingsService 创建的 SocketsHttpHandler 统一启用 AutomaticDecompression = DecompressionMethods.All,透明解压 CDN 或代理返回的 gzip/deflate/Brotli 压缩响应。此前压缩响应无法被反序列化,产生不可诊断的 ExpectedStartOfValueNotFound 错误(如日志中出现的 0x8B gzip 魔数)。

  • 汉化管理网络层重试退避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] 源生成器,消除运行时正则编译开销。

  • 修复设置归一化中代理默认值LauncherSettingsServiceSettingsEditor 的归一化逻辑将无效代理值回退为 ProxyModes.Auto(此前回退为 Direct),与 LauncherSettings 声明默认值保持一致。

  • 修复 HttpClientFactory 代理判断逻辑CreateLeaseAsync 中代理模式判断从 != System 改为 == Direct,使 Auto 模式正确走代理感知路径(通过 ProxySettingsService.CreateHttpHandlerAsync 创建带系统代理检测的 handler)。

v1.0.0-beta.6

v1.0.0-beta.6 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 06 Jul 15:56
425dbe6

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 属性,由按钮父级样式统一控制。
  • 主题色系统全面动态化LauncherAccentSoftBrushLauncherAccentBorderBrushLauncherFocusRingBrushLauncherCarouselDotActiveBrush 全部改为跟随 SystemAccentColor,配合自定义主题色模式实现完整换肤。
  • 状态摘要布局统一:设置页状态摘要行改为单行横向排列(标题 + 版本 + 网络状态 + 磁盘空间),移除了独立的操作备注行。
  • 本地化键名规范化:全面重命名本地化键以确保命名一致性和可发现性(如 loadingTitlelauncherLoadingTitleloadingValuelauncherLoadingValueinstallPathNotConfiguredgameInstallPathNotConfigured),并清理 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 常量。
  • 修复 LauncherApiClientGameDownloadServiceIDisposable 实现未调用 GC.SuppressFinalize 的问题。
  • 修复资源管理对话框(汉化管理界面)尺寸因本地化文本长度变化导致的布局问题,面板改用固定尺寸(720×592)。
  • 修复设置导航栏选中项背景色不跟随自定义主题色的问题。
  • 修复壁纸主题调色板显示不完整的问题。
  • 修复未安装游戏时点击不可用操作缺少提示的问题。
  • 修复确认对话框宽度过宽的问题,添加 MaxWidth 限制。
  • 修复 EasterEggAudioService 中的 ObjectDisposedException 传播问题,添加线程安全的释放守卫。
  • 修复安装程序卸载时对废弃注册清理的遗漏。

v1.0.0-beta.5

v1.0.0-beta.5 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 29 Jun 13:48
425dbe6

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 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 24 Jun 17:50
425dbe6

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 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 22 Jun 03:51
425dbe6

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 精确匹配,避免主机名出现在路径或查询参数中时被误改写。
  • 界面状态修复 — 修复未安装状态下底部面板更改游戏路径后显示不更新。
  • 多用户支持MutexEventWaitHandleGlobal 改为 Local 作用域,允许多用户同时运行启动器。
  • 代码稳健性 — 消除空 catch 块,补全 ConfigureAwait(false),限制非就绪状态卸载,统一末尾目录分隔符。

界面优化

  • 窗口可调整大小 — 启用 CanResize="True",移除最小宽度/高度限制。
  • 无障碍访问 — 所有仅有图标的按钮添加 AutomationProperties.Name,屏幕阅读器可正确读出按钮功能。
  • 叠加层焦点管理 — 新增 OverlayFocusBehavior:叠加层(设置/对话框)显示时自动聚焦第一个可聚焦控件;叠加层关闭时恢复之前的键盘焦点;设置和对话框叠加层启用 TabNavigation="Cycle" 循环导航。
  • Banner 轮播 — 左右翻页按钮添加工具提示与无障碍名称(中/日/英三语);刷新远端内容时自动停止并重置轮播定时器。

技术变更(面向开发者)

  • 日志引擎重构 — 从自研写入器迁移至 Serilog,异步管道单例化并共享给 DI 容器和崩溃处理。
  • 深层模块提取 — 提取 IFileDownloadServiceRemoteManifestServiceWindowEscapeStrategyResourcePanelService 等深模块,减少接口表面积。
  • 本地安装状态重构 — 集中安装状态读写,接入统一运行状态,提取游戏安装路径模块并显式注入。
  • 设置模块简化 — 内联 SettingsNormalizer 消除浅层 seam。
  • 基础设施 — 集中 JsonSerializerOptions 严格配置,增强 VersionComparer,引入 GameDownloadService.Dependencies 记录类型集中依赖管理。
  • CI — 引入 NuGet 缓存,移除构建产物的 Artifact 上传。
  • 测试补充 — 新增本地安装状态、下载恢复边界情况、SSRF URL 验证、Banner 轮播状态、符号链接防护、UI 样式契约等测试。

v1.0.0-beta.2

v1.0.0-beta.2 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 20 Jun 07:29
425dbe6

What's Changed

Features

  • 完善启动器体验并发布 1.0.0-beta.2 (038184f)
  • 支持选择启动器更新文件 (6c9c1dc)

Bug Fixes

  • 优化更新文件选择样式 (35b804b)

Refactoring

  • 深化架构——消除浅层模块、延迟绑定与大杂烩常量 (0d7cc56)
  • 解耦通知视图并提取设置规范化 (f9ff672)
  • 完成设置模块职责拆分 (b25e9a5)
  • 消除共享 HTTP 客户端代理状态 (21bc1ba)
  • 完成设置编辑器与 HTTP 租约模块深化 (06a03ee)
  • 合并代理感知 HTTP 请求创建,完善 SettingsEditor XAML 绑定面 (b5702de)
  • 提取 SettingsEditor 深模块,封装设置状态管理 (008098e)

v1.0.0-beta.1

v1.0.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@gytxtx gytxtx released this 19 Jun 06:18
425dbe6

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)

Other

  • Merge: 合并 origin/main 的远端更改 (5c3e58a)
  • 文档补充 (4cec9ef)
  • 更新 CLAUDE.md 补充缺失的本地文件/设置参考表和服务信息 (b2fe814)
  • 更新分析报告 (0bf25ad)
  • 替换应用程序图标资源 (c011140)
  • 修复 Release 构建并升级 Actions 至 Node.js 24 (46bc9e3)
  • 添加单元测试和自动化发布流程 (adef96b)
  • Initial commit (f0648fa)