跳转至

0.11.2 更新提醒与语言切换验收

日期:2026-10-22。目标版本:0.11.2。本文记录源码与隔离浏览器验收;安装包构建、渠道上传和实体安装由发布记录另行确认。

行为与接入

三个使用模式共用 Layout.Shell 中的 UpdatePromptHost。原来启动时的一次 toast 检查已替换为可操作的更新对话框。启动后约 3 秒开始读取更新清单;成功检查后间隔 6 小时,失败后约 15 分钟重新尝试。回到前台与网络恢复也会在达到检查期限后触发检查。请求使用现有 GitHub / 清华云盘更新链路,后台阶段只读取版本与安装包元信息。

发现新版本后,用户可以选择“前往更新”,或选择 1 小时、1 天、7 天后提醒。默认选择 1 天。提醒期限保存在本机 onethu.update.snooze.v1,与具体版本绑定;新版本仍可提醒。已存在的旧版“忽略此版本”记录继续兼容。Escape 和导航返回调用同一延后操作,保留当前主页面。

“前往更新”将已获取的结果交给共享的 SoftwareUpdateSection。完整模式打开“我的 → 设置 → 关于”并聚焦软件更新;极简和实用模式直接滚到各自精简设置中的软件更新。进入设置复用本次检查结果,下载和系统安装继续由用户点击后发起。

对话框等待可见的设置等 role=dialog / aria-modal 对话框结束;导览隐私页、普通导览页和 .tour-resume 实践返回条都参与避让。本文实际覆盖设置对话框与导览,未将所有右键菜单、锚定菜单的组合列为已验范围。

验收过程中修复的问题

首轮浏览器发现实用模式手机点击“前往更新”后仍停在设置顶部。SoftwareUpdateSection 首次 effect 消费了结果并安排滚动;开发模式 StrictMode 清理该 effect 后取消了计时器,第二次 effect 已无结果可消费。现在组件通过 ref 保留本次交接结果,使再次执行的 effect 重新安排滚动。后续完整、实用、极简三模式的手机和桌面落点都通过验证。

检查中来源名称和已检查的提示原来在请求完成时固化为字符串,切换语言后会保留旧语言。来源现在保留 source ID,应用自产状态使用文案描述符,渲染时按当前语言解析;切源说明按结构化 attempts 重建。学校或发布方提供的原始错误详情、发布说明继续保留原文。

极简和实用首页的两句解释性口号已从 SimpleExperience 删除。首页日期使用当前 uiLocale,英文界面显示英文月、星期和日期顺序。

浏览器验收方法

tools/update-reminder-browser-test.mjs 复用公开演示的独立 Chromium context 和虚构课程、作业、账户数据。测试清单在浏览器网络层拦截:GitHub latest.json 返回虚构 0.11.3,检查新版本隔离时改为 0.11.4。四平台资产均指向 example.invalid,其他外部 HTTP 与全部 WebSocket 被阻断。

版本比较、checkForUpdate、提醒状态、React / OneGUI 对话框、设置组件与导航栈均运行真实实现。测试没有替换这些生产函数,也未新增生产测试开关。1 小时至 7 天的到期验证使用 Playwright clock 推进计时器;本机墙钟未改变。页面 reload 及全新 context 中恢复同一提醒记录分别覆盖文档重建与持久化恢复。

最终导览用例选择“白板 → 首页”实践,以便单独观察实践返回条的避让效果;结束搜索实践时保留搜索面板属于原有工作保留行为,提醒应继续等待该面板关闭。设置退场通过真实关闭按钮验收。测试辅助导入缓存当前文档首次解析的 Vite 模块,避免开发期间重新生成的查询参数形成第二份状态实例。

在应用源码与词典冻结后,最终完整轮次执行完成:133 项通过,passed=true,浏览器运行时错误 0,进程退出码 0。各组计数如下,增量复测与初次失败记录不重复累计:

分组 断言数 覆盖
界面矩阵 84 中英 × 完整/实用/极简 × 390×844 手机/1440×900 桌面,共 12 组,每组 7 项:自动提醒次数、版本与语言、视口、点击区、软件更新落点、正文渲染、结果复用与无下载
时长、持久化和重试 26 1h/1d/7d 的落盘与到期、同次运行再次提醒、reload、全新 context 恢复、新版突破旧版延后、320×568 小屏、失败后静默重试
返回与避让 10 Escape、Android 监听器使用的同一 JS back() 路径、设置对话框退场、隐私导览、白板实践返回条、结束实践后的提醒恢复
语言切换与精简首页 12 弹窗内切语言、交接结果、检查中与完成后切语言、来源、外部 notes 原文、无额外请求/下载,以及实用/极简各自的口号与英文日期
全轮运行时检查 1 浏览器 pageerror 为零
合计 133 唯一最终轮次,不叠加增量运行

此前的返回/避让增量轮为 11 项,语言/首页增量轮为 13 项,其中各含一次运行时检查;这些复测已被最终完整轮覆盖,未加入 133 的总数。最终汇总以完整轮次 report.json 为准。

截图与证据

最终输出目录:/tmp/onethu-update-reminder/。

  • report.json:passed、分组、断言明细、界面尺寸、更新落点及浏览器错误列表。
  • zh-CN-{full,practical,simple}-{phone,desktop}.png:六组中文真实组件截图。
  • en-US-{full,practical,simple}-{phone,desktop}.png:六组英文更新对话框截图;背景课程文字属于公开演示的虚构数据。
  • small-phone-320.png:320×568 小屏的完整提醒操作区。
  • dynamic-locale-settings.png:运行中切换语言后的软件更新结果。

截图已人工检查中文手机、英文实用手机、英文桌面和 320 小屏,更新标题、正文、时长选择及两个操作清晰可读。截图用于工程验收,不作为完整英文宣传素材。

复验命令:

node --import /Volumes/OneTHUBuild/artifacts/mobile-round3-register.mjs tools/update-reminder-browser-test.mjs

增量组可通过 ONETHU_UPDATE_GROUPS=matrix,timing,overlays,locale 选择;ONETHU_TEST_OUT 可指定独立证据目录。本机 loader 只负责解析 Playwright,生产运行依赖不变。

真实环境边界

本轮没有访问真实学校账户,没有向真实云盘写入数据,没有下载或启动实际安装包。更新清单是拦截的虚构响应;学校数据由公开演示夹具提供。结果能证明前端检查编排、提醒期限、三模式设置落点与语言行为;真实 GitHub / 云盘发布状态、网络可达性、包签名和系统安装结果由发布核验承担。

Android 返回验收执行了原生监听器最终调用的真实 JS 导航路径,验证 overlay 消费返回且首页保持可见。实体 Android Activity、不同厂商 WebView、系统返回手势与系统安装器尚需设备验收。桌面 Chromium 手机尺寸模拟同样不代表已在全部 Android / iOS 设备实际运行。