描述
客户使用了 Flutter IM 5.X SDK( rongcloud_im_wrapper_plugin),在处理自定义消息互通时遇到问题,具体包括:
- 无法兼容旧版本 SDK 的自定义消息
- 无法兼容 Android/iOS 平台。
分析(根因分析、需求分析)
rongcloud_im_wrapper_plugin
中, 自定义消息格式发生变化,并且不兼容旧版本 SDK 的自定义消息,收到旧版本的自定义消息后,无法正常进行解析。
解决方案
如果开发者需要进行互通,需要对其他端的自定义消息结构进行改造。
Android/iOS
示例代码下载: 链接: 百度网盘 请输入提取码 提取码: dnfi
以 Android 端为例:
-
首先在原生端注册下面四种类型的消息内容(
MessageContent
):- 不存储不计数的消息:RCIMIWCustomCommandMessage.java
- 存储计数的消息:RCIMIWCustomNormalMessage.java
- 状态消息:RCIMIWCustomStatusMessage.java
- 存储不计数的消息:RCIMIWCustomStorageMessage.java
-
如果原生端已经存在自定义消息,您需要将原有创建、发送自定义消息的流程按照以下方式进行改造。
假设您的 Android 端已经存在一个存储且计数,消息类型标识(Object Name) 为
Test:Text
,并包含一个text
字段的自定义文本消息。改造完成后,您可以在 Android 端使用RCIMIWCustomNormalMessage
发送这类消息。改造方式如下:
-
定义一个 map,只接收 Key、Value 为 String。这个 map 将用于存储自定义消息
Test:Text
的类型标识和数据。Map<String, String> map = new HashMap<>(); map.put('text', text);
-
原始的自定义消息属于存储计数的消息,所以我们选择
RCIMIWCustomNormalMessage
类型。您需要在第一个参数(msgType
)传入原始自定义消息的 Object Name(Test:Text"
)。RCIMIWCustomNormalMessage normalMessage = new RCIMIWCustomNormalMessage("Test:Text", map);
最后将此消息内容调用原本的发送接口发送即可。
-
Web
Web 端需要注册 Flutter 的自定义消息类型,目前支持的 4 类自定义消息信息如下:
- RC:IWNormalMsg:支持离线消息机制,存入服务端历史消息,计入未读消息数【存储,计数】
- RC:IWCmdMsg:支持离线消息机制,不存入服务端历史消息,不计入未读消息数【不存储,不计数】
- RC:IWStatusMsg:不存入服务端历史消息,不计入未读消息数 【不存储,不计数,并且没有离线】
- RC:IWStorageMsg:支持离线消息机制,且存入服务端历史消息,不计入未读消息数 【存储,不计数】
自定义消息包含的属性值
- “msgType”:string,
- “msgFields”: {},// 此属性中的数据格式为 key,value 格式的对象,并且 key,value 都为 String 类型。
注册自定义消息
参见 Web 端开发者文档 自定义消息。
示例
// 注册
const RCIMIWCustomCommandMessage = RongIMLib.registerMessageType('RC:IWCmdMsg', false,false, [], false)
// 构建要发送的自定义消息
const message = new RCIMIWCustomCommandMessage({
msgType: 'C:TestMsg',
msgFields: {"test_value": "value 需要是 String 类型"}
})
// 发送消息
RongIMLib.sendMessage({
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: '用户 ID'
}, message).then(res => {
console.log(res)
})
相关问题
更多支持
如有疑问,欢迎提交工单。