本文介绍消息发送与接收功能的实现流程。

AIMSDK支持端到端的消息发送和接收,同时提供了发送和接收流程上的一定的自定义能力,开发者可以根据自身业务的特点做定制。每个消息都是和会话(单聊和群聊)关联的,发送前消息需要先获得会话标识(cid),如何获得消息关联的会话信息,请参见会话中的获取会话及会话列表

支持的消息类型:文本、图片、视频、语音、地理位置、结构化消息、自定义消息、文件消息、回复消息、转发消息。

消息发送与接收的流程如下:发送与接收

消息发送

消息发送采用标准模式:开发者向AIMSDK发出请求,接收请求结果,发送的过程完全由AIMSDK处理。

消息变更通过两个方式通知开发者,API返回和事件变更。
  • API返回:表示本次请求的结果(成功或失败)。
  • 事件变更:API请求引起的或者服务端推送引起的消息数据的变更。接入方通过实现AIMMsgListenerAIMMsgChangeListener中的接口接收事件通知。

标准模式流程

标准模式
  • GetMsgService:从AIMPubModule中获取AIMPubMsgService
  • SendMessage:开发者构造AIMPubMsgSendMessage对象调用AIMPubMsgService.SendMessage接口。
  • OnAddedMessages(Pending_msg):通知创建了一个新的AIMPubMsg对象(以下称为PendingMsg),消息状态为发送中(Pending),表示已经向服务端发起请求,还没有收到服务端返回,这时消息ID(mid)为空,本地消息标识(LocalID)不为空,消息的未读数也是无效的,消息时间为发起API调用的时间。
  • OnConvLastMsgChange(Pending_msg):会话的最后一条消息变更,消息体内容和OnAddedMessages的消息一致。
  • OnProgress:消息发送的进度,只有发送消息中包含文件上传才会触发,比如图片消息、视频消息等。
  • OnMsgStatusChange(Send_msg):消息状态变更(发送成功/失败),如果消息发送成功,消息ID(mid)非空, 本地消息标识(LocalID)和之前的PendingMsg消息一致, 消息的未读数为实际未读的人数,消息时间会更新为发送成功时的时间,如果发送失败,只更新消息状态,失败的消息可以使用LocalID重发。
  • OnConvLastMsgChange(Send_msg):会话的最后一条消息变更,消息体内容和OnMsgStatusChange的消息一致。
  • OnSuccess:消息发送成功。
  • 多媒体消息(图片、视频、语音、地理位置)有上传的过程,消息体中的upload_file_ptah和mime_type是必填项。
表 1. AIMPubMsgSendMessage
属性 类型 描述
appcid String 会话ID。
content AIMPubMsgContent 消息内容。
receivers List 接收者。如果为空,则发给所有人,如果非空则只发送给指定用户,如果要多端同步需要填自己uid信息。
extension Map 远端扩展信息,用户自定义,发送给服务端。
local_extension Map 本地扩展信息,只在本地存储。
callback_ctx Map 服务端发消息Hook接口信息,接入方自定义。
group_share Bool 如果receivers设置为发送给指定用户,group_share决定是否其他用户是否也能拉取到消息,默认值false。

消息接收

消息接收即消息的同步,AIMSDK使用推拉结合的方式,7000条以内或最近一周的消息采用推送的方式,以外的消息采用主动拉取的方式。此处介绍推送方式,主动拉取方式,请参见获取会话

  • 接收到新消息,除了新消息事件以外,还会引起会话消息未读数变更、会话最后一条消息的变更。
  • 会话消息未读数变更规则:
    • 系统消息未读数不增加:display_style = SYSTEM
    • 当前会话未读数不增加:通过AIMPubConvService.SetActive设置当前会话。
    • 消息未读策略使用了不增加未读数,未读数不增加:服务端接口设置。
    • 消息已经在其他设备上已读未读数不增加。
消息接收
  • OnAddedMessages:接收新消息,消息按照创建时间排序。
  • OnConvLastMessageChanged:会话最后一条消息变更。
  • OnConvUnreadCountChanged:会话消息未读数变更。

    以上两个回调被注册在chat和conversation的场景当中,两个场景对件回调有不同的事件响应,因而要分开处理。

说明 收到新消息通知,需要对已经在UI上的消息在添加新消息后根据消息的创建时间重新排序,因为UI上的消息可能是拉取得到的,收到的消息可能创建的时间更小,不能默认排在后面。