接收消息

通过 MESSAGES 事件接收在线消息;离线期间的消息在连接建立后由服务端补发,客户端按会话聚合。

事件驱动

接收消息通过事件完成,事件名来自 capabilityModel.events。事件以协议帧 JSON 字符串投递到 im_event_cb;按 type 字段分发(message / send_ack / read_receipt / chatroom_event 等)。

消息事件载荷​

字段类型说明
messagesMessage[]收到的消息列表(可能包含离线补发与多端同步消息)

监听消息(本平台)​

C(C ABI)
static void on_event(void* user_data, const char* event_json) {
    /* event_json 为协议帧 JSON;type=message 时解析 {messages:[...]} 或单条消息 */
}
im_client_set_event_callback(client, on_event, NULL);

事件一览​

事件载荷触发时机
CONNECTING{attempt:int}开始连接(含重连尝试)
CONNECTED{userId:string, sessionId?:string}连接成功且离线补发完成
DISCONNECT{code:int, reason:string}连接断开(含错误码与原因)
SUSPEND{code:int, reason:string}服务端挂起连接(多端互踢等)
MESSAGES{messages:Message[]}收到在线 / 离线补发消息
CONVERSATION{conversation:Conversation}会话变更(未读、置顶、草稿等)
MESSAGE_RECALLED{message:Message}消息被撤回
READ_RECEIPTReadReceipt已读回执更新
TYPING{conversationType:ConversationType,targetId:string,userId:string,typing:bool,timestamp:int64}对方正在输入
MESSAGE_REACTION_CHANGED{messageId:string,conversationType:ConversationType,targetId:string,reactionId:string,operation:added|removed|cleared,userId:string,reactionTime:int64,totalCount:uint32,users:string[]?}
MESSAGE_EXPANSION_CHANGED{messageId:string,conversationType:ConversationType,targetId:string,updated:Record<string,string>?,removed:string[]?,timestamp:int64}
STREAM_MESSAGE_CHANGED{streamId:string,messageId:string,conversationType:ConversationType,targetId:string,senderId:string,delta:string,seq:uint32,text:string,status:streaming|ended,complete:bool,timestamp:int64}
PRESENCE_CHANGED{userId:string,online:bool,lastSeenAt:int64,timestamp:int64,reason:connect|disconnect|kick|deactivate}
FRIEND_EVENT{kind:FriendEventKind,request?:FriendRequest,fromUserId?:string,toUserId?:string,timestamp:int64}好友申请 / 同意 / 拒绝
CHATROOM_EVENT{chatroomId:string,kind:ChatroomEventKind,userId?:string,onlineCount?:uint32,chatroom?:Chatroom,timestamp:int64}聊天室加入 / 离开 / 销毁 / 成员变化
KICKED{code:int,reason:string}被踢下线

接收语义​

  • 在线消息实时推送;离线期间的消息在 connect 的 hello 之后自动补发,补发完成后触发 CONNECTED。
  • 同一消息可能因多端同步重复到达,客户端需按 clientMsgId / messageId 去重(协议可靠性约定)。
  • 消息按会话聚合:收到 MESSAGES 后更新会话未读与最后一条消息,排序规则见会话列表。
  • 撤回通过 MESSAGE_RECALLED 事件通知,客户端替换占位而不是删除消息。

相关文档​