消息扩展
1.2.0 版本支持消息扩展
消息扩展功能可为消息对象(Message)增加基于 Key/Value 的状态标识。消息的扩展信息可在发送前、后设置或更新,可用于实现消息评论、礼物领取、订单状态变化等业务需求。
一条消息是否可携带或可设置扩展信息,由发送消息时 Message 的可扩展(canIncludeExpansion)属性决定,该属性必须在发送前设置,发送后无法修改。单条消息单次最多可设置 20 个扩展信息 KV 对,总计不可超过 300 个扩展信息 KV 对。在并发情况下如出现设置超过 300 个的情况,超出部分会被丢弃。
为 Message 消息对象添加的 Key、Value 扩展信息会被存储。如已开通历史消息云存储功能,从服务端获取的历史消息也会携带已设置的扩展信息。
提示
- 消息扩展仅支持单聊、群聊。不支持聊天室和系统会话。
实现思路
以订单状态变化为例,可通过消息扩展改变消息显示状态。以订单确认为例:
- 当用户购买指定产品下单后,商家需要向用户发送订单确认信息。可在发送消息时,将消息对象中的
canIncludeExpansion属性设置为可扩展,同时设置用于标识订单状态的 Key 和 Value。例如,在用户未确认前,可用一对 Key/Value 表示该订单状态为未确认。 - 用户点击确认(或其他确认操作)该订单消息后,订单消息状态需要变更为已确认。此时,可通过
updateMessageExpansion方法更新此条消息的扩展信息,标识为已确认状态,同时更改本地显示的消息样式。 - 商家通过消息扩展状态监听,获取用户指定消息的状态变化,根据最新扩展信息显示最新的订单状态。
消息评论、礼物领取可参照以上实现思路:
- 礼物领取:可通过消息扩展改变消息显示状态实现。例如,向用户发送礼物,默认 为未领取状态,用户点击后可设置消息扩展为已领取状态。
- 消息评论:可通过设置原始消息扩展信息的方式添加评论信息。
监听消息扩展数据变更
消息扩展变更发起方调用 IMLib SDK 方法更新、删除扩展数据后,SDK 内部将向会话对端发送一条类型标识为 RC:MsgExMsg 的消息扩展信令消息。接收方的 MessageExpansionListener 监听器会在 SDK 接收该信令消息后触发相应的回调方法。
接口原型
TypeScript
// MessageExpansionListener.ts
/**
* 消息扩展监听
* @version 1.2.0
*/
interface MessageExpansionListener {
/**
* 消息扩展信息更改的回调
*
* @param expansion 消息扩展信息中更新的键值对
* @param message 消息
* @discussion 该方法的 expansion 只包含更新的键值对,不是全部的数据。如果想获取全部的键值对,请使用 message 的 expansion 属性。
*/
onMessageExpansionUpdate(expansion: Map<string, string>, message: Message);
/**
* 消息扩展信息删除的回调
* @param keyArray 消息扩展信息中删除的键值对 key 数组
* @param message 消息
*/
onMessageExpansionRemove(keyArray: Array<string>, message: Message);
}
// IMEngine.ts
/**
* 设置消息扩展监听
* @param listener 监听
* @version 1.2.0
*/
public setMessageExpansionListener(listener: MessageExpansionListener): void ;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| listener | MessageExpansionListener | 消息扩展监听器。提供 onMessageExpansionUpdate()(消息扩展信息更改时)和 onMessageExpansionRemove()(消息扩展信息删除时)方法。 |
示例代码
您需要调用 IMEngine 的 setMessageExpansionListener 方法设置消息扩展监听器。
TypeScript
let listener: MessageExpansionListener = {
onMessageExpansionUpdate: (expansion: Map<string, string>, message: Message): void => {
let jsonString = JSON.stringify(Array.from(expansion.entries()));
hilog.info(0x0000, 'IM-App', 'onMessageExpansionUpdate result expansion:%{public}s message:%{public}s',
jsonString, JSON.stringify(message));
},
onMessageExpansionRemove: (keyArray: string[], message: Message): void => {
hilog.info(0x0000, 'IM-App', 'onMessageExpansionRemove result keyArray:%{public}s message:%{public}s',
JSON.stringify(keyArray), JSON.stringify(message));
}
}
IMEngine.getInstance().setMessageExpansionListener(listener);