如何在Ejabberd 16.09服务器中集成FCM推送通知
在Ejabberd 16.09中集成FCM推送通知的方案
结合你已经用mod_apns.erl实现APNS推送的经验,其实集成FCM的思路是相通的——毕竟FCM是GCM的官方继任者,我们可以基于现有mod_gcm.erl改造,或者参考mod_apns的结构从零实现一个适配FCM的模块。下面是具体的可行方案:
核心思路
FCM向下兼容大部分GCM的接口规范,但也有一些细节调整。考虑到你用的是Ejabberd 16.09这个相对旧的版本,推荐优先选择改造现有mod_gcm.erl适配FCM,或者参考mod_apns的架构实现mod_fcm.erl,后者更贴合FCM当前的API规范。
方案一:改造mod_gcm.erl适配FCM
这是最快的方式,因为GCM和FCM的核心逻辑差异不大:
- 替换API端点:把GCM的请求地址从
https://gcm-http.googleapis.com/gcm/send改成FCM的https://fcm.googleapis.com/fcm/send - 更新请求头:FCM仍然支持GCM的
Authorization: key=YOUR_SERVER_KEY格式,你只需要把原来的GCM服务器密钥换成FCM的服务器密钥(在Firebase控制台获取) - 调整请求体(可选):FCM兼容GCM的
data字段格式,但你可以新增notification字段来支持原生通知样式(比如标题、内容、图标等),示例请求体:{ "to": "DEVICE_FCM_TOKEN", "notification": { "title": "新消息", "body": "来自好友的消息" }, "data": { "room_jid": "room@conference.example.com", "message_id": "12345" } } - 修改响应处理逻辑:FCM的响应格式和GCM类似,但新增了一些错误码(比如
Unavailable、InternalServerError),需要在模块里处理这些情况,比如重试逻辑、标记无效token等
方案二:参考mod_apns实现mod_fcm.erl
如果你想更贴合FCM的最新规范,可以参考mod_apns的结构编写全新的mod_fcm.erl:
- 复制基础框架:把
mod_apns里的初始化、连接池、消息发送等核心逻辑复制过来,替换APNS相关的代码 - 实现FCM API调用:
- 选择FCM的HTTP Legacy API(适合旧版本Ejabberd,无需OAuth2认证)或者HTTP v1 API(更安全,但需要处理OAuth2令牌刷新)
- 处理FCM的请求签名(Legacy API用服务器密钥,v1 API用服务账号密钥生成JWT令牌)
- 适配设备token管理:和
mod_apns管理APNS token一样,在mod_fcm里实现用户FCM token的存储、更新、删除逻辑 - 处理FCM响应:解析FCM返回的响应,处理成功发送、token失效、限流等情况,更新用户的设备信息
Ejabberd配置步骤
不管用哪种方案,都需要在ejabberd.cfg里配置FCM模块:
# 如果是改造mod_gcm,修改原有配置 {mod_gcm, [ {api_key, "YOUR_FCM_SERVER_KEY"}, # 替换成你的FCM服务器密钥 {pool_size, 5}, # 连接池大小,根据并发需求调整 {timeout, 5000} # 请求超时时间 ]}, # 如果是新实现mod_fcm,添加如下配置 {mod_fcm, [ {api_key, "YOUR_FCM_SERVER_KEY"}, {pool_size, 5}, {timeout, 5000} ]},
客户端配合
- 安卓客户端需要集成Firebase SDK,获取FCM设备token
- 把获取到的token发送到Ejabberd服务器,存储到用户的设备信息中(和之前GCM token的存储逻辑一致)
- 客户端实现FCM消息接收逻辑,处理推送通知的展示、跳转等
测试验证
- 在Ejabberd服务器上发送一条测试推送消息,检查服务器日志是否有调用FCM API的记录
- 查看FCM控制台的消息发送统计,确认消息是否成功送达
- 检查安卓设备是否收到推送通知
内容的提问来源于stack exchange,提问作者Nilesh Vaghela
相关产品推荐
相关产品推荐

