
moodle 3.9.4 中移动端推送通知出现“标题(subject)与正文(message)内容完全相同”的异常,根本原因通常在于第三方通知服务 airnotifier 的消息组装逻辑被意外修改,而非 moodle 原生通知配置所致。
moodle 3.9.4 中移动端推送通知出现“标题(subject)与正文(message)内容完全相同”的异常,根本原因通常在于第三方通知服务 airnotifier 的消息组装逻辑被意外修改,而非 moodle 原生通知配置所致。
该问题表现为:无论在「Badge → Notification message」中如何编辑通知模板,修改内容均同时作用于推送通知的标题栏与消息正文,导致标题失去语义性(如本应显示“Great! You have received your badge!”),而被冗长的正文说明所替代。
根本原因分析
Moodle 本身通过 core\notification 和 message_popup 等插件生成结构化通知事件,并将 subject 和 message 字段分别传递给消息处理器。但当使用 Airnotifier(常用于对接 Firebase Cloud Messaging / Apple APNs)作为移动推送网关时,其 PHP 服务端代码(通常位于 local/airnotifier/ 或独立部署的 Airnotifier Server)负责将 Moodle 传入的通知数据映射为平台兼容的推送 payload。若该层代码中错误地将 $notification->message 同时赋值给 payload 的 title 和 body 字段(例如硬编码 title => $msg->message, body => $msg->message),就会覆盖原生的 subject 字段,造成标题与内容同源。
快速定位步骤
- 确认你正在使用 Airnotifier 插件(检查
Site administration > Plugins > Local plugins > Airnotifier是否启用); - 检查 Airnotifier 相关代码中消息构造逻辑,重点关注
send_notification()、build_payload()或类似方法; - 搜索关键词:
'title' =>、'alert' =>、'body' =>,确认是否对subject字段未做读取或被误替换。
典型修复示例(Airnotifier 服务端 PHP)
// ❌ 错误写法:忽略 subject,统一用 message
$payload = [
'title' => $notification->message,
'body' => $notification->message,
];
// ✅ 正确写法:区分 subject(标题)与 message(正文)
$payload = [
'title' => !empty($notification->subject) ? $notification->subject : get_string('notification', 'moodle'),
'body' => $notification->message,
];
注意事项
- 不要修改 Moodle 核心通知模板语言包或
badge/message设置来“绕过”此问题,这无法解决底层映射逻辑缺陷; - 若 Airnotifier 已升级至较新版本(如 v3.10+),请核查其 CHANGELOG 是否已修复该行为;
- 修改后务必清除 Moodle 缓存(
Site administration > Development > Purge all caches)并重启 Airnotifier 服务(如为独立进程); - 建议在测试环境验证修复效果,可借助 Firebase Console 的「Send test message」功能比对 payload 结构。
综上,该问题并非 Moodle 配置疏漏,而是 Airnotifier 层级的字段映射失当。回归通知设计初衷——标题应简洁醒目、正文承载细节——关键在于确保推送服务正确解析并分发 subject 与 message 两个独立字段。










