Flutter SDK 如何与其他端的自定义消息互通(rongcloud_im_wrapper_plugin )?

描述

客户使用了 Flutter IM 5.X SDK( rongcloud_im_wrapper_plugin),在处理自定义消息互通时遇到问题,具体包括:

  • 无法兼容旧版本 SDK 的自定义消息
  • 无法兼容 Android/iOS 平台。

分析(根因分析、需求分析)

rongcloud_im_wrapper_plugin 中, 自定义消息格式发生变化,并且不兼容旧版本 SDK 的自定义消息,收到旧版本的自定义消息后,无法正常进行解析。

解决方案

如果开发者需要进行互通,需要对其他端的自定义消息结构进行改造。

Android/iOS

示例代码下载: 链接: 百度网盘 请输入提取码 提取码: dnfi

以 Android 端为例:

  1. 首先在原生端注册下面四种类型的消息内容(MessageContent):

    • 不存储不计数的消息:RCIMIWCustomCommandMessage.java
    • 存储计数的消息:RCIMIWCustomNormalMessage.java
    • 状态消息:RCIMIWCustomStatusMessage.java
    • 存储不计数的消息:RCIMIWCustomStorageMessage.java
  2. 如果原生端已经存在自定义消息,您需要将原有创建、发送自定义消息的流程按照以下方式进行改造。

    假设您的 Android 端已经存在一个存储且计数,消息类型标识(Object Name) 为 Test:Text,并包含一个 text 字段的自定义文本消息。改造完成后,您可以在 Android 端使用 RCIMIWCustomNormalMessage 发送这类消息。

    改造方式如下:

    1. 定义一个 map,只接收 Key、Value 为 String。这个 map 将用于存储自定义消息 Test:Text 的类型标识和数据。

      Map<String, String> map = new HashMap<>();
      
      map.put('text', text);
      
    2. 原始的自定义消息属于存储计数的消息,所以我们选择 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)   
})

相关问题

更多支持

如有疑问,欢迎提交工单