# 机器人消息排版

## 前言

智能机器人消息作为云信内置的一种基本消息，相比其他消息类型，有其不一样的特殊性如下：

 * **机器人的上下行消息**

   机器人的消息分上行和下行两种。用户发给机器人的消息称为上行消息，通常以纯文本形式展现，在组件中，复用了和文本消息同样的配置；机器人发给用户的消息称为下行消息，消息模板由用户在管理后台配置，消息内容可以允许以文本，图片，按钮的形式进行自由组合，这样会造成在界面上的表现形式比较繁多。

 * **机器人消息交互层面的迷惑性**

   机器人消息经常会和文本消息有一定的类似，特定的交互形式下，两者还会由于用户的输入进行改变，以组件的交互举例：
   * 当用户在输入框中 @ 的用户不包括机器人时，组件认为这是一条文本，以文本消息形式发出。
   * 当用户在输入框中 @ 的用户包括机器人时，组件认为这是一段需要和机器人交互的内容，会自动以机器人消息形式发出。

   虽然在界面展示形式上都是一个气泡中包含了一些文字，但由于 @ 的对象不同，实际上消息类型是有一定差异的。

 * **机器人下行消息模板界面**

   机器人消息模板由用户在管理后台，机器人知识库中自行配置。一般以 xml 布局文件形式下发到客户端，这个时候客户端需要解析整个模板数据，构造出适合的布局模型，再传入视图进行渲染。


## 机器人模板布局数据解析

   由于机器人后台可提供的数据形式比较灵活，数据可以由后台内置的类型机型有限的组合，也可以由开发者进行完全的自定义。这里组件针对前一种有限组合的情况，提供了一套快速集成的模板数据转换到视图的方案。

   机器人下行消息中，获取真正属于“机器人回复”的内容可通过 `RobotAttachment` 调用`getResponse` 方法，这已经是 `SDK` 将 xml 转换成 json 格式后的结果。
   
```java
RobotAttachment attachment = (RobotAttachment) message.getAttachment();

// 下行消息
if (attachment.isRobotSend()) {
	String robotContent = attachment.getResponse();
}
```

接下来组件通过机器人回复内容 `robotContent` 构造`RobotResponseContent` 对象，交给 `RobotContentLinearLayout` 展示。

### 模板数据视图

机器人回复消息由文本、按钮、图片组成，其中按钮对应机器人协议中的 link 元素所对应的内容。按钮内部又可以嵌套文本、图片、按钮。
`UIKit` 提供了一组自定义View 展示不同的机器人消息元素。单条机器人下行消息整体视图为 `RobotContentLinearLayout`，可以从 `RobotResponseContent` 直接构建对象。

机器人回复内容元素与自定义视图对应关系

|内容元素|自定义视图|
|:---|:---|
|文本| RobotTextView|
|图片| RobotImageView|
|link| RobotLinkView|

   
