Flutter SDK 如何发送命令消息和命令通知消息(RCIMIWMessageType.command 与 RCIMIWMessageType.commandNotification )?

描述

使用 Flutter 5.4.0 以上版本,无法创建和发送 RCIMIWCommandNotificationMessage (命令消息)和 RCIMIWCommandNotificationMessage(命令通知消息)类型的消息。

分析

Flutter SDK 目前不提供命令消息( RCIMIWCommandNotificationMessage )和命令通知消息(RCIMIWCommandNotificationMessage)的 create 方法,如需要在客户端发送此消息,需要在 Flutter 层先定义此消息的包装类。该方式仅支持 5.4.0 及以上版本。

具体参考下面内容进行处理。

解决方案

创建命令消息

  1. 首先在 Flutter 层定义此消息, 创建 wrapper_command_message.dart

    import 'package:rongcloud_im_wrapper_plugin/rongcloud_im_wrapper_plugin.dart';
    import 'dart:convert' as json_lib show json;
    
    // 自定义消息需要继承 RCIMIWUserCustomMessage
    //
    class RCIMDCommandMessage extends RCIMIWUserCustomMessage {
      String? name;
      String? data;
      // 1. 定义自己的构造方法,需要调用父类的 RCIMIWUserCustomMessage(RCIMIWConversationType type, String targetId)
      RCIMDCommandMessage(RCIMIWConversationType type, String targetId, this.name, this.data) : super(type, targetId);
    
      // 2. 需要继承父类的构造函数
      RCIMDCommandMessage.fromJson(Map<String, dynamic> json) : super.fromJson(json);
    
      // 3. 需要实现父类的 decode/encode/messageObjectName
      @override
      void decode(String jsonStr) {
        Map map = json_lib.json.decode(jsonStr.toString());
        // 获取的 key 值要与原生传递的 key 值一样
        name = map['name'];
        name = map['data'];
      }
    
      @override
      String encode() {
        Map map = {};
        // 传递的 key 值要与原生传递的 key 值一样
        map['name'] = name;
        map['data'] = data;
        return json_lib.json.encode(map);
      }
    
      @override
      String messageObjectName() {
        return "RC:CmdMsg";
      }
    
      // 4. 需要实现父类的 toJson
      @override
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> json = super.toJson();
        // 此处 'content' 不可修改
        json['content'] = encode();
        return json;
      }
    }
    
    
  2. 在项目的原生层进行注册

    iOSxxxx/ios/Runner/AppDelegate.m

    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [GeneratedPluginRegistrant registerWithRegistry:self];
        NSMutableArray *marr = [NSMutableArray arrayWithObjects:[RCDPokeMessage class], [RCCommandMessage class], nil];
        [RCIMWrapperEngine sharedInstance].messageContentClassList = marr.copy;
        ...
    }
    
    

    Android: example/android/app/src/main/java/cn/rongcloud/im/wrapper/flutter/example/MainActivity.java

    public class MainActivity extends FlutterActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            List<Class<? extends MessageContent>> list = new ArrayList<>();
            list.add(PokeMessage.class);
            list.add(CommandMessage.class);
            RCIMWrapperEngine.getInstance().messageContentClassList = list;
    
        }
    }
    

发送命令消息

  RCIMDCommandMessage msg = RCIMDCommandMessage(type, targetId, "name", "data");
  _sendMessage(msg, useCallback);

收到的消息和发送成功之后的消息都会处理为 RCIMIWCommandMessage。 其他使用此消息的位置例如接收消息,只需处理 RCIMIWCommandMessage 即可。

如有疑问,欢迎提交工单