[即时通信IM]群@消息如何实现?

2020-07-29 19:33:09 浏览数 (1)

作者:腾讯云-ahqzhang

群内 @ 消息与普通消息没有本质区别,仅是在被 @ 的人在收到消息时,需要在UI上做特殊处理,例如QQ的消息列表中会有标红提示。具体实现可以参考以下方案:

  • 1 在发送消息时监听键盘事件,是否输入了 @ 字符,当检测到发送方输入了 @ 字符时,在UI上弹出群成员列表,以供发送方选择需要 @ 的人,假设被选到的用户为 user1
  • 2 选择完需要被 @ 的人后,在消息输入框里添加上 @ 及被选中的人的id, 例如 "@user1"
  • 3 在消息中添加一个 TIMCustomElem , 并在 TIMCustomElem 里添加自己设计的标识该消息为 @ 消息的消息协议。 一个简单的协议定义可以如下:
代码语言:javascript复制
  {
      "type":"REMIND",
      "target":"user1"
  }

@消息的构建过程示例代码如下(以android平台为例):

代码语言:javascript复制
  // 发送一条文本消息,并在消息中 @ 群成员 user1
  TIMMessage msg = new TIMMessage();

  //构建文本消息元素体
  TIMTextElem txtElem = new TIMTextElem();
  txtElem.setText("@user1 nice to meet u");
  if(msg.addElement(txtElem) != 0){
      Log.e(TAG, "add text elem failed");
      return;
  }

  try{
      //填充自定义的消息协议
      JSONObject remindProto = new JSONObject();
      remindProto.put("type", "REMIND");
      remindProto.put("target", "user1");

      //根据自己定义的协议构建自定义消息元素
      TIMCustomElem customElem = new TIMCustomElem();
      customElem.setDesc("remind msg");
      customElem.setData(remindProto.toString().getBytes("utf-8");
      if(msg.addElement(customElem) != 0){
          Log.e(TAG, "add custom elem failed");
          return;
      }
  }catch(Exception e){
      Log.e(TAG, "build custom elem failed");
      return;
  }

注: 其中 TIMTextElem 不是必须的,如果确认不需要进行脏字过滤的情况下,可以把 TIMTextElem 中的消息内容填到 TIMCustomElem 中的 desc 属性中。

  • 4 构建好消息后,发送到群里
  • 5 群里的成员接收到消息后,检查消息中的 TIMCustomElem 中的消息协议是否是 @ 消息协议。如果是, 则进行下一步处理,否则跳过
  • 6 判断被 @ 的人是否与当前登录用户一致,如果是,则在UI中进行特殊处理,否则不需要处理

0 人点赞