# 手机浏览器开发验收(0.2.29 候选,未发布) 此轮改善电脑托管、手机浏览器访问时的编辑可靠性,以及 Android 自备 Python / external Studio 的前端体验。正式发行版本仍为 0.2.28;没有新增 iOS App 或 Android 原生 Python/ONNX 包。 ## 已实现 - 原生工作台监听页面隐藏和 `pagehide`,在编辑器延迟回调到达之前收集最后输入,沿用按作品、 文档隔离的本机恢复草稿。触屏点选区操作时保留选中的正文。 - 修正真实 Vditor 初始化期间提前读取 Lute 的竞态;首次读取等编辑器 `after` 就绪。 - 手机与平板的章节栏、参考栏关闭时不可交互;窄屏保持可用编辑高度、触控按钮和表单字号。 - 导出先挂载下载链接,再延迟回收 Blob 地址,覆盖中文文件名、UTF-8 `filename*` 和含 `%` 的旧文件名。 - 独立 Core Studio 的正文也增加本机恢复草稿。草稿按作品路径、作品 ID、文档和服务器版本隔离; 刷新后明确提示恢复或下载。服务器版本变化时禁止直接恢复,保留副本供作者比对。 编辑新版正文不会覆盖旧版冲突草稿。 - 手动保存先读取最后输入;保存请求绑定原作品和文档。切章后晚到的响应不能替换当前正文; 请求途中继续输入的内容保留为待保存草稿。保留现有服务器版本冲突检查。 本机草稿保存在该浏览器、该站点的 localStorage,不能替代作品备份,也不会在设备间同步。 浏览器禁用存储或空间不足时会提示手动保存。独立 Studio 这一轮恢复范围为正文;资料表单 仍按既有保存流程使用。手机系统强制结束浏览器不保证触发生命周期事件,建议看到保存成功再离开。 ## 自动回归 `packages/studio-panel/scripts/mobile-browser.mjs` 使用真实 Vditor,分别运行 Chromium 和 WebKit, 检查 320 / 390 / 768 像素宽度及 480 像素可视高度。隔离夹具不打开作品,不调用模型。 覆盖后台前的中文与 emoji 输入、模拟组合输入、触屏选区、中文下载文件和内容、窄屏抽屉、 刷新恢复、服务器版本冲突、显式恢复、立即保存、切章后的旧保存响应,以及保存途中继续输入。 组合输入事件是模拟值,不能代替真机中文输入法。 CI 从待发布 tgz 提取 Core wheel,核对原生编辑器源码与包内 source map、编译 CSS 及供应商资源, 再运行上述用例。两种引擎的报告均为发布验收前置条件,记录安装包 SHA-256 和输入来源。 WebKit 是浏览器引擎测试,不等于 iPhone Safari、iOS 模拟器或 Android/Termux 验收。 本地源码验证: ```sh node packages/studio-panel/scripts/mobile-browser.mjs --browser=webkit --core=/absolute/core/tools/studio_assets node packages/studio-panel/scripts/mobile-browser.mjs --browser=chromium --core=/absolute/core/tools/studio_assets ``` ## 之后的真机验收 iPhone / iPad 可以测试电脑托管的 Web 工作台或独立 Studio。电脑需保持运行,手机通过受信任的 私有网络或经过认证的 HTTPS 入口访问;手机上的 `127.0.0.1` 指向手机自身。不要直接公开未鉴权的 Core 端口。DSH 的远程入口与访问控制按所用宿主版本设置;OpenWrite 不提供独立的 iOS 本地后端。 在测试作品中逐项记录设备、系统、浏览器、宿主和候选包版本: 1. 打开章节、人物与设定,确认关闭的抽屉不能挡住正文;竖屏、横屏和软键盘弹出时能继续编辑。 2. 用中文输入法连续输入、选择候选词并加入 emoji;立即保存,刷新确认最后一句和格式完整。 3. 输入后立即切 App、锁屏再回来;检查服务器保存状态。未保存时刷新,应能恢复本机草稿。 4. 在另一浏览器修改同章后回来,检查版本冲突提示;旧草稿只下载对比,不覆盖新版正文。 5. 长按选择正文后使用扩写或审稿入口,确认作用范围。先检查预览;实际模型请求另计。 6. 导出 Markdown / EPUB,确认下载名称和文件内容,再检查“文件”App 中的文件。 7. 快速切章、切作品,在网络较慢时保存,确认正文和草稿归属正确。 Android / Termux 另需按照 [安装说明](INSTALL.md#android--termux) 验收解释器、原生依赖、 external 鉴权、Workspace 路径绑定及实际工具调用。iOS 测试不能替代这部分。 上述真机项目仍待完成,继续在 [#123](https://github.com/LiPu-jpg/Openwrite/issues/123) 跟踪。