消息计数、存储与推送策略

融云在「消息类型概述」中为每种消息类型定义了三个默认属性:是否计入会话未读、是否进入客户端本地存储与离线缓存、是否默认触发远程推送。本页给出完整矩阵,并说明本项目服务端的实际策略与差异。

先看结论

本项目没有 objectName,也没有按消息类型区分的计数/推送开关:所有落库的新消息(单聊/群聊/系统通知)统一计入接收方会话未读,聊天室消息不落库也不计未读;离线推送只有服务端 webhook,没有 APNs/FCM/厂商通道。未实现的部分请不要按融云默认值对外承诺。

融云默认策略矩阵(28 行)​

消息类型objectName分类计数与存储离线缓存默认推送
文本消息RC:TxtMsg用户内容类计入未读,客户端存储支持默认推送
高清语音消息RC:HQVCMsg用户内容类计入未读,客户端存储支持默认推送
图片消息RC:ImgMsg用户内容类计入未读,客户端存储支持默认推送
GIF 图片消息RC:GIFMsg用户内容类计入未读,客户端存储支持默认推送
图文消息RC:ImgTextMsg用户内容类计入未读,客户端存储支持默认推送
文件消息RC:FileMsg用户内容类计入未读,客户端存储支持默认推送
位置消息RC:LBSMsg用户内容类计入未读,客户端存储支持默认推送
小视频消息RC:SightMsg用户内容类计入未读,客户端存储支持默认推送
引用消息RC:ReferenceMsg用户内容类计入未读,客户端存储支持默认推送
合并转发消息RC:CombineMsg用户内容类计入未读,客户端存储支持默认推送
撤回通知消息RC:RcNtf通知类客户端存储,不计入未读支持默认不推送
提示条通知消息RC:InfoNtf通知类客户端存储,不计入未读支持默认不推送
群组通知消息RC:GrpNtf通知类客户端存储,不计入未读支持默认不推送
命令提醒消息RC:CmdNtf通知类客户端存储,不计入未读支持默认不推送
正在输入状态消息RC:TypSts状态类不存储,不计入未读不支持不支持推送
命令消息RC:CmdMsg信令类不存储,不计入未读支持默认不推送
撤回命令消息RC:RcCmd信令类不存储,不计入未读支持默认推送
单聊已读回执消息RC:ReadNtf信令类不存储,不计入未读支持默认不推送
群聊已读回执请求消息RC:RRReqMsg信令类不存储,不计入未读支持默认不推送
群聊已读回执响应消息RC:RRRspMsg信令类不存储,不计入未读支持默认不推送
多端已读状态同步消息RC:SRSMsg信令类不存储,不计入未读支持默认不推送
聊天室属性通知消息RC:chrmKVNotiMsg信令类不存储,不计入未读支持默认不推送
实时音视频接受信令RC:VCAccept信令类不存储,不计入未读支持默认推送
实时音视频挂断信令RC:VCHangup信令类不存储,不计入未读支持默认推送
实时音视频邀请信令RC:VCInvite信令类不存储,不计入未读支持默认推送
实时音视频切换信令RC:VCModifyMedia信令类不存储,不计入未读支持默认推送
实时音视频成员变化信令RC:VCModifyMem信令类不存储,不计入未读支持默认推送
实时音视频响铃信令RC:VCRinging信令类不存储,不计入未读支持默认推送

补充口径(融云默认值):聊天室与超级群不支持离线缓存;Web 与小程序不支持客户端消息存储;通知类与状态类默认不推送;通知类若在发送时显式设置推送标题与内容,仍可触发推送。

本项目的计数与存储​

content.type计入未读客户端存储(移动/桌面)服务端存储离线补发离线推送(webhook)
text是是是是是
image是是是是是
file是是是是是
voice是是是是是
location是是是是是
custom是是是是是
recall否(替换原消息)是(占位)是(原地替换)是(原消息在离线队列时)否
system是(系统会话)是是是否
  • 未读由服务端在消息落库时对每个接收者 +1;发送者自己的其他端不计未读。@ 消息额外累计 mentionedCount。
  • 撤回不新增消息:服务端把原消息内容替换为 recall 占位,因此不会额外 +1 未读。
  • 聊天室消息只在在线连接间广播,不落库、不补发;因此聊天室消息离线后不可恢复。
  • 系统通知只允许服务端发往系统会话;当前不会触发离线推送 webhook。

本项目的离线与历史​

项本项目行为
服务端历史消息写入 journal/状态并支持 message.history.get 分页(beforeSeq 向前翻页,默认 20、最大 100)。
离线队列每会话最多 500 条;连接建立后按 seq 补发,客户端 ACK 推进游标。
聊天室不落库、不补发;加入后最多获取最近 50 条(由聊天室语义决定)。
超级群conversationType=GROUP + groupType=super;持久化、支持离线与多端,但消息没有 channelId,频道级隔离未实现。
客户端本地存储按平台实现;本项目 Web SDK 不做本地持久化,刷新后依赖服务端历史(与融云“Web 不保证本地存储”的结论一致)。

推送策略与差异​

能力融云默认本项目当前差异
用户内容类离线推送默认推送,预置标题/内容仅 webhook,需应用自行配置无通道、无预置文案、无点击跳转
通知类推送默认不推送,可自定义推送内容不推送(通知类 objectName 未实现)无对应消息类型
状态类推送不支持不支持(输入状态走 WS 帧)一致
多设备推送默认只推最后登录设备无设备维度,webhook 按 userId 逐个投递无 token 与设备表
推送内容标题/内容/@ 文案优先级webhook 原样携带完整 message由应用自行构造系统通知
推送统计控制台/统计接口push.log.list、push.stats.day、push.stats.by-id仅 webhook 投递统计

离线消息 webhook 的触发与载荷​

当消息的接收者没有任何在线 WS 会话时,服务端会异步 POST 到应用配置的 webhook;超时 3 秒、失败只记日志、不阻塞投递、不做重试与签名。

JSON
{
  "appkey": "demo",
  "userId": "u2",
  "reason": "offline",
  "message": {
    "messageId": "m_9f2a",
    "conversationType": 1,
    "targetId": "u2",
    "senderId": "u1",
    "seq": 42,
    "timestamp": 1750000000000,
    "direction": 2,
    "content": {
      "type": "text",
      "text": "你好"
    }
  }
}

配置入口是 Admin API POST /api/admin/apps/{appkey}/push(webhookUrl + enabled),不属于 Open API;完整接入步骤见 推送接入。

另外,push.send 可以按 all|tag|package|user|users 发送“不落地通知”,但它同样只是把载荷投递到同一个 webhook,并不是 APNs/FCM 通道。

推送内容与透传规则​

项融云规则本项目当前
消息推送文案发送消息时可传 pushContent(标题/内容);未传时用户内容类使用预置文案消息接口没有 pushContent/pushData 参数;webhook 原样携带完整 message,由接收方生成文案
@ 提及文案mentionedContent 优先级最高,覆盖默认/自定义 pushContentmentionedInfo 只影响会话 mentionedCount 与客户端高亮;没有推送文案覆盖
pushData 透传随通知透传到客户端,用于点击后的业务路由无通知载荷;webhook 的 message 可作为路由依据
push.send extras随不落地通知透传extras 只进入 webhook 载荷与推送日志,不经过厂商通道
推送语言/模板按客户端上报语言匹配模板未实现(规划中)
通知栏展示标题、内容、图标、角标、分组未实现;由 webhook 接收方自行调用系统/厂商 API
鉴权与签名应用配置与厂商凭证由服务端托管webhook 无签名、无鉴权头;接收方需自行限制来源

与融云的差异清单​

  • 封闭类型 vs objectName:本项目 ContentType 固定 8 值,新增消息类型必须改 IDL 与各端 SDK;融云可通过 objectName + 内容体扩展。
  • 无按类型抑制计数:融云通知/状态/信令类有不同计数策略;本项目统一计数(撤回除外)。
  • 撤回模型不同:本项目原地替换为 recall,融云生成 RC:RcNtf 通知消息与 RC:RcCmd 命令。
  • 无远程推送通道:只有 webhook;没有 token 注册、厂商适配、点击跳转、角标、多语言模板。
  • 无客户端消息存储策略差异:各端 SDK 自行决定本地库,服务端不区分类型。
  • 超级群:本项目按普通群持久化,没有频道级计数/推送/历史隔离。
排期

消息类型扩展、推送通道、多端同步与按端已读、超级群客户端能力:均以本页标注的“未实现 / 部分实现”为准。

在对应条目完成前,以上“未实现”结论保持不变。

相关页面​

融云原文(证据):/platform-chat-api/message-about/about-message-types