iOS PWA:保存编辑卡在“保存中”,无法访问编辑器,且听写文本丢失

我在 2026 年 10 月 21 日编辑自托管 Discourse 实例中的现有帖子时遇到了一个间歇性问题。编辑器卡在**保存中(Saving)**状态,我无法返回编辑器以恢复一些口述的文本。

事后我检查了 Caddy 和 nginx 访问日志以及 Discourse 的帖子修订历史。

环境

  • 客户端: iPhone 16 Pro,Safari 主屏幕 PWA

  • iOS: 27.0.1

  • Discourse: 2026.10.0-latest +406 commits,如当天稍后管理仪表板所示(有 162 个较新的更改可用)

  • 托管方式: 自托管,私人研究档案库

  • 反向代理: Caddy v2.11.4,提供基于 QUIC 的 HTTP/3

  • 后端: Discourse nginx 位于 Caddy 之后,使用 Unix socket

  • 网络: 最初使用大学 Wi-Fi,随后切换到 EE 蜂窝网络

发生了什么

我正在编辑一个包含物理讲座幻灯片图片的帖子。

我在图片下方口述了一些额外的数学笔记,包括分数,然后迅速按下了保存编辑(Save Edit)。

蓝色的水平保存中条一直显示在屏幕底部,并未完成。

我尝试点击“保存中”条,但这并没有重新打开编辑器。因此,我无法在其他地方选择或复制未保存的文本。

我等待的时间比平时更长。

只有在保存操作已经卡住后,我才手动禁用了 Wi-Fi,希望切换到蜂窝网络能让请求完成。

界面没有立即恢复。在尝试使用站点标志导航时,我也遇到了缓冲问题。

当我能够再次编辑该帖子时,口述的分数不见了。

服务器端调查

相关时间大约是 2026 年 10 月 21 日 BST 12:20。

我的 Caddy 日志显示:

时间 (BST) 请求 结果
12:19:39 POST /drafts.json 200
12:19:40 POST /uploads.json 200
12:19:44 POST /drafts.json 200
12:20:08 PUT /posts/70695 Caddy 状态 0
12:20:55 PUT /posts/70695 200

失败的 PUT 请求使用了 HTTP/3。Caddy 记录持续时间约为 110 毫秒,而 nginx 记录了一个 HTTP 400 响应,且没有执行 Discourse 帖子更新控制器。

来自蜂窝连接的许多其他请求也在大约同一时间收到了 Caddy 状态 0。

Caddy 本身并未重启。Docker 报告自 10 月 15 日以来零次重启,操作日志中没有相应的重载或关闭事件。

草稿恢复

在事件发生前,有成功的草稿保存请求。

然而,我记得之前的内容是只有幻灯片图片,没有额外的口述文本。我后来输入了分数,并很快按下了保存编辑。

因此,我无法确定缺失的口述内容是否包含在任何一次成功的自动保存中。

当我随后检查帖子修订版本时,12:20:55 的成功修订版本包含图片,但不包含口述的分数。

我还检查了当前的草稿记录,但在检查时,旧主题和新主题的草稿键都没有剩余的草稿。

预期行为

如果编辑请求卡住或被中断,我希望编辑器能保留其未保存的内容,并提供一种重试、取消或返回编辑的方式。

特别是,理想情况下,当显示“保存中”时,界面不应使未保存的文本无限期地不可访问。

实际行为

编辑器保持不可访问状态,点击“保存中”条没有重新打开它,并且当编辑恢复时,口述的文本不再可用。

问题

  1. 当编辑请求未完成时,编辑器是否预计会无限期地保持不可访问?

  2. 是否有超时或恢复机制旨在在网络请求被中断时恢复编辑功能?

  3. 即使请求从未到达 Rails 帖子更新控制器,中断的保存编辑操作是否应保留内存中的文本或草稿内容?

  4. 如果此问题在 iOS 上再次发生,任何特定的客户端日志或仪器化会有帮助吗?

我理解网络变更可能解释了最终的请求取消。然而,在我手动更改网络之前,“保存中”界面就已经卡住了。

我尚未确定初始延迟是源自 Discourse 的 JavaScript、iOS/WebKit 网络还是大学连接。

相关讨论

我有一个现有的 MPTCP / iOS 连接连续性讨论,其中我从传输角度描述了这一相同的事件。

我之前还报告过 已编辑的帖子在 iOS 上的 DiscourseHub 中偶尔保持陈旧状态。在那个单独的问题中,编辑已成功到达服务器,但已渲染的帖子在刷新之前没有更新。另一位用户也报告注意到了这种行为。

我不知道这两个问题是否共享同一原因。当前事件不同,因为初始的帖子编辑请求没有被成功处理。

我还发现了两个早期涉及编辑器卡在“保存中”的报告:

两者都有已确定的不同原因,我不认为它们能解释这次事件。

我附带了一个 ZIP 文件 discourse_ios_save_evidence_2026-10-21_domain_redacted.zip (6.3 KB),其中包含选定的、已隐去域名的 Caddy/nginx 诊断摘录、修订信息以及上述时间线。

我很乐意得到关于编辑器如何从停滞的请求中恢复的建议,特别是在网络中断前无法复制未保存更改的情况下。

2026 年 10 月 28 日 针对 iOS PWA 出现的一些问题进行的后续更新,当前环境为 iOS 27.2(iPhone 16 Pro)。

这些问题并非原始“听写丢失”问题的完全复现,但我已检查 Caddy 和 nginx 日志以了解具体情况。

10:58 GMT — 主题操作卡住

在离开图书馆时,界面上的一个主题操作似乎卡住了。

Caddy 记录了两条发往 POST /t/13515/merge-topic 的 HTTP/3 请求:

  • 10:58:16: 状态码 0,持续时间约 0.15 毫秒。
  • 10:58:41: HTTP 200,持续时间约 595 毫秒。

成功的请求也出现在 nginx 日志中,路径为 topics/merge_topic,状态码 HTTP 200。

这证实了后续的请求被成功处理,但并未解释为何较早的请求在未返回完整响应的情况下结束。

12:26 GMT — PWA 加载问题

在阶梯教室期间,我无法正常加载 PWA。

Caddy 记录了四条针对主 Discourse JavaScript 捆绑包的 HTTP/3 请求,完成时间介于 12:27:05 至 12:27:42 之间。

所有请求均返回 HTTP 200,并记录了 627,219 字节的响应数据,但其持续时间分别约为 31.4、27.1、29.4 和 17.3 秒。

在此时间段之前和之后,同一资源的正常加载时间均不超过一秒。

12:42 GMT — 进一步的 PWA 加载问题

另一个针对相同 JavaScript 捆绑包的 HTTP/3 请求耗时约 24.3 秒。

在 12:42:41,Caddy 还记录了一个不完整的 HTTP/2 反向代理响应:

aborting with incomplete response
writing: write tcp ...: connection reset by peer

上游服务是现有的指向 nginx 的 Unix socket。该错误发生在 Caddy 向面向客户端的 TCP 连接写入数据时,而非已识别出的 Unix socket 故障。

日志无法确定重置是由 iOS 发起,还是由客户端与 VPS 之间的网络基础设施发起。

在两次阶梯教室事件期间,我未手动更改 iPhone 的网络设置。

与原始报告的相关性

我理解这些加载问题和主题操作问题可能与原始的“保存编辑”问题有不同的成因。

然而,它们表明在我依赖 PWA 进行笔记编辑的情况下,iOS PWA 遇到了严重的请求延迟和中断的响应。

我的主要疑问仍然是:当“保存编辑”请求停滞时,编辑器是否应预期保留未保存的文本并使其可访问,而不是将其留在“正在保存”状态后变得不可访问。

如果您能提供关于有用的客户端诊断方法或预期的编辑器恢复行为的指导,我将不胜感激。