
moodle 3.9.4 中移动端推送通知出现标题(subject)与正文(message)内容完全相同的问题,根源在于第三方推送服务 airnotifier 的消息组装逻辑异常,而非 moodle 原生配置或语言包设置。
moodle 3.9.4 中移动端推送通知出现标题(subject)与正文(message)内容完全相同的问题,根源在于第三方推送服务 airnotifier 的消息组装逻辑异常,而非 moodle 原生配置或语言包设置。
该问题表现为:无论在「Badge → Message」设置中如何修改通知文案,其内容均同时填充至推送通知的标题栏和消息正文栏,导致用户收到的移动通知缺乏语义区分(如标题失去概括性,无法快速识别事件类型)。经排查确认,此现象并非由 Moodle 后台通知模板、语言字符串(如 badgenotification)、插件钩子(core\event\badge_issued)或自定义消息处理器引起,而是源自 Airnotifier 服务端在构建 APNs/FCM 推送载荷时,错误地将 message 字段值同时赋给了 title 和 body 字段。
Airnotifier 是 Moodle 官方推荐的独立推送网关(常用于替代过时的 moodle-mobile-app 内置推送),其核心逻辑位于 airnotifier/src/Notification.php 及相关消息适配器中。典型问题代码片段如下(需检查):
// ❌ 错误示例:Airnotifier 某版本中可能存在的硬编码逻辑
$payload = [
'title' => $notification->message, // ← 错误:应取 $notification->subject 或专用字段
'body' => $notification->message, // ← 正确用途,但 title 不应复用
];
✅ 修复步骤:
- 登录 Airnotifier 服务部署目录(如
/var/www/airnotifier); - 检查
src/Notification.php中toApnPayload()和toFcmPayload()方法; - 确保
title字段优先读取$notification->subject(或从 Moodle 传入的title参数),而非强制使用message; - 若
$notification对象无subject属性,需回溯至 Moodle 的message_output_airnotifier插件(路径:/message/output/airnotifier/),确认send_message()是否正确传递了title参数(参考core\notification标准接口规范); - 升级 Airnotifier 至最新稳定版(≥ v3.1.0),官方已在 issue #187 中修复此类逻辑缺陷。
⚠️ 注意事项:
- 切勿直接修改 Moodle 核心语言包(如
lang/en/badges.php)试图绕过该问题,这会导致多语言失效且不可维护; - 在 Airnotifier 修复前,临时规避方案是:在
message_output_airnotifier插件的renderer.php中对$event->get_notification_title()做预处理,注入简短标题(如"Badge Awarded"),再透传至 Airnotifier; - 验证修复效果时,请清除 Airnotifier 缓存并重启服务(
systemctl restart airnotifier),同时使用curl -X POST手动触发测试推送,避免依赖 Moodle 后台缓存。
总结:该问题本质是 Airnotifier 与 Moodle 消息协议对接不严谨所致,属于集成层缺陷。定位时应优先审查 Airnotifier 代码而非 Moodle 配置,遵循“外部服务优先排查”原则可大幅缩短调试周期。










