MongooseIM开发XMPP聊天应用Inbox未读计数异常如何解决
问题核心原因
MongooseIM的XEP-0430 Inbox模块默认会将所有chat类型的消息计入未读、并返回在查询结果中,不会自动过滤XEP-0022事件、XEP-0184回执这类仅用于信令交互、不含实际消息内容的报文,因此会出现未读计数虚高的问题。
方案1:服务端配置Inbox过滤规则(最推荐,无客户端兼容问题)
MongooseIM的Inbox模块原生支持配置可计入未读的消息规则,你需要在mongooseim.toml里修改mod_inbox的配置:
- 找到配置文件中
[modules.mod_inbox]段,添加affects_unread_count过滤规则:
[modules.mod_inbox] affects_unread_count = """ all(msg.body) and not(exists(msg.event)) and not(exists(msg.receipt)) """
以上规则的意思是只有包含body字段(也就是正常的文本/富文本消息)、且不含XEP-0022的event节点、不含XEP-0184的receipt回执节点的消息,才会被计入未读计数、且在Inbox查询中返回。你可以根据自己的信令格式扩展规则,比如如果你的自定义信令有特定的extension节点,直接在规则里加not(exists(msg.你的自定义节点名))即可。
方案2:自定义Inbox查询过滤(如果不想改全局配置)
如果要兼容现有业务不修改全局计数规则,可以在客户端请求Inbox的时候加过滤参数,MongooseIM支持XEP-0430的filter扩展,请求的时候携带过滤条件,只返回符合要求的消息:
<iq type="get" id="inbox1"> <inbox xmlns="urn:xmpp:inbox:0"> <x xmlns="jabber:x:data" type="submit"> <field var="has-body" type="boolean"> <value>true</value> </field> <field var="has-event" type="boolean"> <value>false</value> </field> <field var="has-receipt" type="boolean"> <value>false</value> </field> </x> </inbox> </iq>
这个请求会让服务端只返回有body、没有event和receipt节点的消息,返回的未读计数也会自动按这个规则统计,不需要修改服务端全局配置。
方案3:客户端兜底过滤(不推荐,仅临时应急)
如果暂时无法修改服务端配置,可以在客户端拿到Inbox返回结果后,手动过滤掉不含body字段、或者包含信令节点的消息,自行计算正确的未读计数。注意这个方案仅适合临时测试用,生产环境不建议使用,会浪费带宽和客户端性能。
内容的提问来源于stack exchange,提问作者Montyroty
相关产品推荐
相关产品推荐

