WuKongIM Docs

HarmonyOS 媒体与历史消息

接入媒体上传,并在本地消息不足时从业务服务补齐历史消息。

编辑此页报告文档问题

SDK 管理媒体消息的状态和传输流程,但不会替你的应用选择对象存储或历史消息 HTTP API。这两项能力都通过 WKIM.shared.config.provider 接入。

媒体上传

在应用启动时安装一次上传 Provider:

WKIM.shared.config.provider.uploadAttachmentCallback = async (
  message: WKMsg
): Promise<[boolean, WKMsg]> => {
  const content = message.messageContent
  if (!(content instanceof WKImageContent)) {
    return [false, message]
  }

  try {
    content.url = await mediaUploader.upload(content.localPath)
    message.messageContent = content
    return [true, message]
  } catch (_) {
    return [false, message]
  }
}

然后用本地文件创建图片正文:

const image = new WKImageContent('/data/storage/el2/base/files/photo.jpg')
image.width = 1080
image.height = 1920

WKIM.shared.messageManager().send(
  image,
  new WKChannel('team-1', WKChannelType.group)
)

Provider 成功前必须把可下载地址写入 content.url。返回 [false, message] 时,消息会进入失败状态,UI 应提供重试入口。

图片正文已由 SDK 注册。语音和视频模型需要先用 registerMsgContent 注册,再在同一个上传 Provider 中按正文类型处理。

远端历史消息

设置历史 Provider,把业务 API 返回值转换为 WKSyncChannelMsg

WKIM.shared.config.provider.syncMessageCallback = async (
  channel: WKChannel,
  options: SyncOptions
): Promise<WKSyncChannelMsg> => {
  const response = await messageApi.sync({
    channelId: channel.channelId,
    channelType: channel.channelType,
    startMessageSeq: options.startMessageSeq,
    endMessageSeq: options.endMessageSeq,
    limit: options.limit,
    pullMode: options.pullMode
  })
  return toWKSyncChannelMsg(response)
}

转换结果包括 startMessageSeqendMessageSeqmoremsgs。每条 WKMsg 应保留服务端消息 ID、序号、发送者、频道、时间和正文 JSON。

聊天页继续调用 getOrSyncHistoryMessages。SDK 会先读取本地数据,需要时再调用这个 Provider,并把返回消息保存到本地。

Provider 是进程全局配置

再次赋值会替换上一次实现。请在应用级 IM 服务中集中设置,并让 Promise 在成功和失败时都能结束。

本页内容