# 机器人消息排版 ## 前言 智能机器人消息作为云信内置的一种基本消息,相比其他消息类型,有其不一样的特殊性如下: * **机器人的上下行消息** 机器人的消息分上行和下行两种。用户发给机器人的消息称为上行消息,通常以纯文本形式展现,在组件中,复用了和文本消息同样的配置;机器人发给用户的消息称为下行消息,消息模板由用户在管理后台配置,消息内容可以允许以文本,图片,按钮的形式进行自由组合,这样会造成在界面上的表现形式比较繁多。 * **机器人消息交互层面的迷惑性** 机器人消息经常会和文本消息有一定的类似,特定的交互形式下,两者还会由于用户的输入进行改变,以组件的交互举例: * 当用户在输入框中 @ 的用户不包括机器人时,组件认为这是一条文本,以文本消息形式发出。 * 当用户在输入框中 @ 的用户包括机器人时,组件认为这是一段需要和机器人交互的内容,会自动以机器人消息形式发出。 虽然在界面展示形式上都是一个气泡中包含了一些文字,但由于 @ 的对象不同,实际上消息类型是有一定差异的。 * **机器人下行消息模板界面** 机器人消息模板由用户在管理后台,机器人知识库中自行配置。一般以 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|