Skip to content

消息管理

发送消息

说明

发送消息的方法

typescript

 /**
  *  发送消息
  * @param model  消息内容
  * @param channel 频道对象 个人频道,群频道
*/
WKIM.shared.messageManager().send(model: WKMessageContent, channel: WKChannel);

文本消息

typescript
// 文本消息
let textModel: WKTextContent = new WKTextContent('你好,悟空')

// 发送给用户A
WKIM.shared.messageManager().send(textModel, new WKChannel('A', WKChannelType.personal));

图片消息

typescript
// 图片消息
let imageModel: WKImageContent = new WKImageContent(localPath)
imageModel.width = 100
imageModel.height = 100

// 发送给用户A
WKIM.shared.messageManager().send(imageModel, new WKChannel('A', WKChannelType.personal));

自定义消息

参考自定义消息: 自定义消息

消息入库返回(并不是消息发送状态)

在发送消息时,sdk 将消息保存在本地数据库后就会触发入库回调。此时消息并未进行发送,可在此监听中将消息展示在 UI 上

typescript
 // 监听发送消息入库
WKIM.shared.messageManager().addInsertedListener((msg) => {
    // 将消息展示在 UI 上
})

新消息

监听新消息事件

typescript
// 新消息监听器
newMsgsListener = (msgs: WKMsg[]) => {
   // 处理新消息
  }

// 监听新消息
WKIM.shared.messageManager().addNewMsgListener(this.newMsgsListener)

// 移除新消息监听
WKIM.shared.messageManager().removeNewMsgListener(this.newMsgsListener)

刷新消息

在 sdk 更新过消息时,如:消息发送状态,有人点赞消息,消息已读回执,消息撤回,消息被编辑等等,sdk 都将回调以下事件。UI 可通过消息对象WKMsg的clientMsgNO来判断具体是哪条消息发生了更改。

typescript
// 刷新消息监听器
refreshMsgListener = (msg: WKMsg) => {
// 处理刷新消息
}

// 监听刷新消息
WKIM.shared.messageManager().addRefreshListener(this.refreshMsgListener)

// 移除刷新消息监听
WKIM.shared.messageManager().removeRefreshListener(this.refreshMsgListener)

查看某个频道的聊天信息

typescript
let option = new ChannelMsgOptions(() => {
      // 同步中 按需显示loading
    }, (list) => {
        // 消息数据
    })
option.oldestOrderSeq = 0 // 最后一次消息大orderSeq 第一次进入聊天传入0
option.contain = false // 是否包含 oldestOrderSeq 这条消息
option.pullMode = 1 // 拉取模式 拉取模式 0:向下拉取 1:向上拉取
option.limit = 20 // 一次拉取消息数量
option.aroundMsgOrderSeq = 0 // 查询此消息附近消息 如 aroundMsgOrderSeq=20 返回数据则是 [16,17,19,20,21,22,23,24,25]
// 查看某个频道的聊天信息
WKIM.shared.messageManager().getOrSyncHistoryMessages(channel, option)

离线消息

需要实现同步频道消息数据源 频道消息数据源

因为WuKongIM 是支持消息永久存储,所以会产生海量的离线消息。对此我们采用了按需拉取的机制,如 10 个会话一个会话 10 万条消息,WuKongIM 不会把这个 10*10 万=100 万条消息都拉取到本地。 而是采用拉取这 10 个会话的信息和对应的最新 20 条消息,也就是实际只拉取了 200 条消息 相对 100 万条消息来说大大提高了离线拉取速度。用户点进对应的会话才会去按需拉取这个会话的消息。 这些机制 SDK 内部都已做好了封装,使用者其实不需要关心。使用者只需要关心最近会话的变化和监听获取数据的回调即可。

数据结构说明

消息结构

typescript
export class WKMsg {
  // 服务端唯一消息ID
  messageId = "";
  // 服务端消息序号
  messageSeq = 0;
  // 客户端消息序号
  clientSeq = 0;
  // 消息时间戳
  timestamp = 0;
  // 过期时间
  expireTime = 0;
  // 过期时间戳
  expireTimestamp = 0;
  // 客户端唯一编号
  clientMsgNo = "";
  // 发送者uid
  fromUID = "";
  // 所属频道ID
  channelId = "";
  // 所属频道类型
  channelType = WKChannelType.personal;
  // 消息类型
  contentType = 0;
  // 消息内容字符串
  content = "";
  // 消息状态 1.发送成功 0.发送中
  status = 0;
  voiceStatus = 0;
  // 是否删除 1.是
  isDeleted = 0;
  // 搜索关键字
  searchableWord = "";
  // 消息发送者资料
  private from?: WKChannel
  // 消息所属频道资料
  private channelInfo?: WKChannel
  // 消息发送者在频道内资料 群消息才有值
  private memberOfFrom?: WKChannelMember
  // 排序号
  orderSeq = 0;
  // 是否已读
  viewed = 0;
  // 已读时间
  viewedAt = 0;
  // 话题ID
  topicId = "";
  // 本地扩展
  localExtraMap?: Record<string, object>
  // 远程扩展
  wkMsgExtra?: WKMsgExtra
  // 消息回应点赞数据
  reactionList?: WKMsgReaction[]
  // 消息正文
  messageContent?: WKMessageContent
}

消息正文结构

typescript
export class WKMessageContent {
  // 消息类型
  contentType: number = 0
  // 消息内容
  content: string = ""
  // 渲染消息内容 如@某人时需要渲染@xxx这段文字
  entities?: ArrayList<WKMsgEntity>
  // 消息回复
  reply?: WKReply
  // 提醒信息
  mentionInfo?: WKMentionInfo
}

本文档内容版权属于 上海信必达网络科技有限公司,保留所有权利