
moodle 3.9.4 中出现移动通知的“标题(subject)”与“正文(message)”显示相同内容的问题,根源常在于第三方推送服务 airnotifier 的自定义逻辑覆盖了 moodle 原生的通知结构,导致消息体被错误地同时用于标题和正文字段。
moodle 3.9.4 中出现移动通知的“标题(subject)”与“正文(message)”显示相同内容的问题,根源常在于第三方推送服务 airnotifier 的自定义逻辑覆盖了 moodle 原生的通知结构,导致消息体被错误地同时用于标题和正文字段。
该问题并非 Moodle 核心行为——标准 Moodle 在发送移动通知时,会严格区分 subject(标题)和 message(正文)两个字段:例如在「徽章通知」设置中(Site administration > Badges > Badge notifications),管理员可独立配置「通知标题」与「通知消息」,二者应分别映射至推送通知的标题栏与展开内容区。
然而,当系统集成了 Airnotifier(一个常用于 Moodle 的开源推送网关,尤其在旧版定制化部署中广泛使用),其 PHP 处理逻辑可能被修改为统一取用 $notification->message 作为推送 payload 的 title 和 body 字段,从而覆盖了 Moodle 原生的 get_notification_title() 与 get_notification_message() 分离机制。
典型问题代码位置(Airnotifier 插件内):
检查路径:/local/airnotifier/classes/notification.php 或 /local/airnotifier/db/notifications.php,重点关注构建推送数据的函数,例如:
// ❌ 错误示例:标题与正文均取自 message 字段
$payload = [
'title' => $notification->message, // ← 错误!应调用专用标题方法
'body' => $notification->message, // ← 正确用途,但标题不应复用
];✅ 正确做法应为:
// ✅ 修正后:分离获取标题与正文
$title = !empty($notification->subject)
? format_string($notification->subject, true, $course)
: get_string('notification', 'moodle');
$body = format_text($notification->message, $notification->messageformat, [
'context' => $context,
'noclean' => true,
'para' => false
]);
$payload = [
'title' => $title,
'body' => $body,
];排查与修复步骤:
- 确认是否启用
local_airnotifier插件(Site administration > Plugins > Local plugins); - 检查该插件下所有涉及
core\notification或message_output_airnotifier的类文件,重点搜索title、set_title、notify_user等关键词; - 验证
message_output_airnotifier::send_message()方法中 payload 构建逻辑; - 若发现硬编码使用
$notification->message赋值给 title,请替换为$notification->subject或调用get_notification_title()(需确保$notification对象支持该方法,否则需适配); - 清除 Moodle 缓存(
Site administration > Development > Purge all caches)并重新测试徽章等通知场景。
⚠️ 注意事项:
- 不要直接修改核心 Moodle 文件(如
message/output/mobile.php),此问题几乎不会源于核心; - 若 Airnotifier 已深度定制,建议备份当前逻辑后升级至官方维护版本(如 moodle-local_airnotifier 的最新稳定版),其 v3.10+ 已明确支持标题/正文分离;
- 测试时务必使用真实移动设备或 Firebase Cloud Messaging(FCM)调试工具验证推送 payload,避免仅依赖 Web 端日志判断。
从根本上说,该问题反映的是插件层对 Moodle 消息契约(core\notification 接口规范)的违背。保持插件与核心的消息字段语义一致性,是保障多端通知体验准确性的关键。

















