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)
}转换结果包括 startMessageSeq、endMessageSeq、more 和 msgs。每条 WKMsg 应保留服务端消息 ID、序号、发送者、频道、时间和正文 JSON。
聊天页继续调用 getOrSyncHistoryMessages。SDK 会先读取本地数据,需要时再调用这个 Provider,并把返回消息保存到本地。
Provider 是进程全局配置
再次赋值会替换上一次实现。请在应用级 IM 服务中集中设置,并让 Promise 在成功和失败时都能结束。