# 聊天通知未显示的问题

**URL:** <https://meta.discourse.org/t/bug-with-chat-notifications-not-showing-up/308082>\
**Category:** Bug\
**Tags:** notifications, chat\
**Created:** [2024年五月15日 14:00 UTC](https://meta.discourse.org/t/bug-with-chat-notifications-not-showing-up/308082 "2024-05-15T14:00:04Z")\
**Posts on this page:** 1\
**Showing post:** 32

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2025年十一月22日 22:35 UTC](https://meta.discourse.org/t/bug-with-chat-notifications-not-showing-up/308082/32 "2025-11-22T22:35:18Z")

</div>

> [@Alex\_Harrington](#):
>
> 但在历史上，它们完全没有起作用，或者只是零星地起作用，而且在 Discourse 升级时肯定有完全关闭的习惯。

我开始研究这段代码，但我觉得一个大问题在于“期望”方面

- 这是关于推送通知吗？（如果是，您使用的是 PWA 还是 Discourse Hub App）
- 当人们说“没有收到通知”时，他们是指“没有收到有关推送通知中提及的通知”吗？
- 期望是在您已经在线时通过推送通知收到关于 @提及 的通知吗？

* * *

我将一大类问题视为已知问题，我们可以进行改进。

1. 在 PWA 中，如果我们尝试在 24 小时内推送 3 次并失败（由于与消息分发器的连接或其他任何原因），我们将终止订阅，并且不会向用户发出任何警报。
2. 在 Hub 中，只有 Discourse 托管客户才能使用推送通知。
3. 存在一些排序问题，导致在编辑聊天消息时可能会错过通知，因为我们在事务内部引发了推送通知
4. 我们有一个 1 分钟的“去抖动”（Debounce），它是可配置的，但令人困惑。我刚刚被提及，但我没有收到 PN。`push notification time window`（推送通知时间窗口）。这导致：@提及，我恰好在 60 秒内访问了应用程序。没有 @提及。
5. 如果您在用户未关注的频道中 @提及 用户，他们将不会收到提及。（按设计）

老实说，@lindsey / @j.jaffeux / @pmusaraj，我觉得“大声疾呼”可能会消除人们遇到的绝大多数问题以及多年来我们看到的关于聊天通知的抱怨。

- 立即始终推送 @提及 通知（站点默认设置），希望延迟的站点可以进行配置。
- 始终从所有频道推送 @提及 通知，仅排除用户明确静音（或无权查看）的频道，这与论坛上的行为一致。
- `update_message.rb` 中有一些奇怪的东西在事务内发布消息。（在多线程环境中，这可能会丢失）
- 如果我们在 PWA 中终止了订阅，请在 PWA 上显示一个横幅，说明 - 未配置推送通知，您想配置它们吗？也许在 1 周/2 周后而不是 1 天后才终止。
- 推送标签是按频道去重的，hostname-chat-mention-general… 这对于提及来说并不理想，因为我们按频道折叠，如果 4 个不同的人在不同时间在同一频道中提及您，这可能会令人困惑。
- 即使用户在线，也要始终推送通知（默认设置）- 允许用户覆盖此行为（如果他们愿意）。
- 锦上添花的是，对于配置了 Discourse ID 的用户（通过 Discourse ID），在所有站点上支持一流的推送通知 - 这将使 Hub 在所有方面都具有一致的感觉。

基本上，默认情况下，消除许多“哎呀，我们不应该通知您的逻辑”。

* * *

在 Discourse 升级时完全关闭，对于自托管用户来说，肯定可能是由于与推送网关的连接问题。也许某些服务器上的升级需要几天时间，也许在某些情况下有 24 小时的内网。

* * *

相关代码（通过 Gemini 3 pro）

### PWA 订阅被终止

在 24 小时内 3 次失败后终止订阅的逻辑位于 `handle_generic_error` 方法中。

- [app/services/push\_notification\_pusher.rb](https://github.com/discourse/discourse/blob/main/app/services/push_notification_pusher.rb#L103-L119)

### 推送通知去抖动/在线检查

检查用户是否在线（“去抖动”）并跳过推送通知的逻辑集中在此处。这依赖于 `SiteSetting.push_notification_time_window_mins`。

- [app/jobs/regular/push\_notification.rb](https://github.com/discourse/discourse/blob/main/app/jobs/regular/push_notification.rb#L6-L7)
- [app/jobs/regular/send\_push\_notification.rb](https://github.com/discourse/discourse/blob/main/app/jobs/regular/send_push_notification.rb#L5-L9)

### 聊天：事务排序问题

`UpdateMessage` 服务将 `publish` 步骤包装在数据库事务中。这可能会导致竞态条件，即通知作业在事务提交之前尝试读取消息。

- [plugins/chat/app/services/chat/update\_message.rb](https://github.com/discourse/discourse/blob/main/plugins/chat/app/services/chat/update_message.rb#L57-L63) (事务块)
- [plugins/chat/app/services/chat/update\_message.rb](https://github.com/discourse/discourse/blob/main/plugins/chat/app/services/chat/update_message.rb#L122-L139) (发布步骤)

### 聊天：在未关注的频道上提及

代码在处理公共频道的提及内容时明确过滤 `following: true`，从而阻止未关注该频道用户的通知。

- [plugins/chat/app/jobs/regular/chat/notify\_mentioned.rb](https://github.com/discourse/discourse/blob/main/plugins/chat/app/jobs/regular/chat/notify_mentioned.rb#L26-L31)

### 聊天：推送通知标签

此处定义了按频道去重通知（折叠它们）的标签生成逻辑：

- [plugins/chat/lib/chat/notifier.rb](https://github.com/discourse/discourse/blob/main/plugins/chat/lib/chat/notifier.rb#L37-L39)

---

_[View the full topic](https://meta.discourse.org/t/bug-with-chat-notifications-not-showing-up/308082)._
