1 消息使用场景
场景一 评论信息不需要保留,直播过后不留存 流程如下:
客户端 ---> socket套接字 ---> IM服务器 ---> 消息分发
场景二 评论信息需要保留,回看时再次显示 流程如下:
客户端 ---> https ---> 业务服务器 ---> IM服务器 ---> 消息分发
两种方式对比
场景一
前端消耗小,消息及时,但是IM服务消耗大,业务处理较为复杂(如果需要处理业务)
场景二
前端消耗较大(频繁发消息建立http),消息较为及时,业务处理简单(可由业务层处理更加容易控制 ,比如禁言接口直接返回被禁言信息发送失败,客户端服务端均好实现)
SDK中公布了场景一的群聊调用方法,可自行斟酌使用
2 消息实现方式
采用谷歌Protobuf库做编解码,Socket通信需要传字节流,json等方式不太合适直接发送,通过Protobuf将信息包装成二进制,通过socket发送,对应客户端接收解码即可,protobuf 定义的消息类
message Message {
int64 id = 1;
string messageId = 2;//消息ID
string action = 3;//动作类型
string title = 4;//消息标题
string content = 5;//消息内容 配合format使用
string format = 6;//消息格式 定义content的格式
string groupId = 7;//接收信息的分组ID
string sender = 8;//消息发送者
string extra = 9;//附加信息
int64 timestamp = 10;//时间戳 毫秒
int32 receiveType = 11;//接收类型 0 个人 1群组
string receiver = 12;//消息接收者
string companyId = 13;//租户ID
string appCode = 14;//应用标识
}
将文件转成 Java OC js 对应语言文件,IM服务推送时会构建message对象转成二进制发送给对应分组的人员
3 消息解析
客户端收到message需要解析不同的action ,云视将action定义为字符串数字,并且默认保留0-1000作为系统占用值。客户端拿到message先判断action是不是纯数字,不是的话舍弃。以下是已给出的action定义:
0 系统提示(暂未定义)
1 服务器IP节点更换通知 (不需要处理)
此类型SDK内部自行处理重连,用户不会收到此类型message
2 直播间全员禁言(暂未定义)
3 直播间评论 (json格式)
{
"beCommentedId":"aaa", //被评论人ID
"beCommentedName":"lucy",//被评论人姓名
"doCommentId":"bbb", //评论人ID
"doCommentName":"kate", //评论人姓名
"content":"666666", //评论内容
"time":"1579425010000" //评论时间 毫秒时间戳 string
"identity":"fans" //评论人身份 admin(管理员)fans(普通粉丝)anchor(主播)
"beCommentedIdentity" //被评论人身份
}
客户端按照json解析content , 示例展示 :
评论人姓名 回复 被评论人姓名 : 评论内容
可根据ID是否和直播间主播ID是否相同判断主播是否参与了评论
注意,回复时字段均有值,评论时beCommentedName,beCommentedId也会回传不过值为空字符串,评论id可从message对象中获取messageId字段
4 直播间通知 (暂未定义)
5 直播间公告 (暂未定义)
6 直播间点赞 (暂未定义)
7 用户进入直播间(json格式)
{
"userId":"",//用户ID
"userName":"",//用户名称
"onlineCount":10,//直播间在线人数
"groupId":""//直播间ID
}
客户端按照json解析content , 示例展示 :
欢迎 用户名称 进入了直播间
同时取出onlineCount 更新直播间人数。提示:人数不必在+1 IM 服务器已自行处理
8 用户离开直播间(json格式)
{
"userId":"",//用户ID
"userName":"",//用户名称
"onlineCount":10,//直播间在线人数
"groupId":""//直播间ID
}
客户端按照json解析content ,取出onlineCount 更新直播间人数。 一般直播平台不会显示谁离开了直播间
9 直播间单人禁言(json格式)
{
"name":"lucy", //被禁言人姓名
"time":3600, //单位为秒 -1为永久禁言
"userId":"aaa" //用户ID
}
客户端取出name 展示
被禁言人姓名 被主播禁言
同时,客户端判断收到禁言信息的是不是自己,如果是更新对应UI,并且开启计时保证自动解封(评论接口也会返回禁言状态,最好还是前端保证不让其调用接口)。
10 直播间关注(text格式)
content含义关注人名称 客户端取出content 展示
content 关注了主播
11 直播间分享 (暂未定义)
12 直播间在线人数 (暂未定义)
13 直播间评论被删除 (json格式)
{
"doCommentId":"5ea80f85d541bc000601f067", //评论人Id
"doCommentName":"187*****933", //评论人name
}
客户端取出id 判断删除是否为自己的评论进行提示,示例
管理员删除了您的评论
具体参考您的业务设计
需要注意,目前不会将评论内容返回,评论id可从message对象中获取messageId字段
14 直播间上线
不需要解析 content为空 客户端对应处理界面
15 直播间下线
不需要解析 content为空 客户端对应处理界面
16 直播间解除单人禁言(json格式)
{
"name":"lucy", //姓名
"userId":"aaa" //用户ID
}
客户端判断收到解除禁言的是不是自己,如果是更新对应UI。
17 直播间暂停
不需要解析 content为空 客户端对应处理界面
注意,groupId可从message对象中获取groupId字段
18 直播间恢复
不需要解析 content为空 客户端对应处理界面
注意,groupId可从message对象中获取groupId字段
19 直播间结束直播
不需要解析 content为空 客户端对应处理界面
注意,groupId可从message对象中获取groupId字段
20 直播间开始直播
不需要解析 content为空 客户端对应处理界面
注意,groupId可从message对象中获取groupId字段
21 将某商品推送到直播间(json格式)
{
"companyId":"" //租户ID
"thumbnail":"obs.com", //商品图片
"address":"tianmao.cn", //商品地址
"taobaoToken":"", //淘宝口令
"price":"20.00", //商品单价
"name":"小米电视", //商品名称
"courseId":"" //客户端课程ID
"platform":1, //数字类型 1京东 2淘宝 3拼多多 4有赞 5蘑菇街 6唯品会 7微小店 8客户端课程
"showPrice":"yes" //是否展示价格,字符串"yes"展示 "no"不展示,并且price字段返回空字符串
}
客户端收到后台推送到直播间的消息,展示商品信息,用户点击商品,客户端携带信息尝试打开对应平台的app。当platform为8时,会回传courseId
注意,商品id可从message对象中获取messageId字段做为商品ID
22 取消直播
不需要解析 content为空 客户端对应处理界面
注意,groupId可从message对象中获取groupId字段
23 将某商品取消推送到直播间
不需要解析 content为空 客户端对应处理界面
注意,商品id可从message对象中获取messageId字段做为商品ID
以上给出的action都会按照format返回content(7和8类型目前format缺失,再次更新会加上),客户端可直接默认action返回的类型不必判断。action根据平台需求也为持续增加 届时会更新文档
4 自定义消息
系统默认保留0-1000的action 如果客户需要定义新的动作,需要在1000以上扩展,例如:
1001 用户收藏直播间(json格式)
{
"name":"lucy", //姓名
"userId":"aaa" //用户ID
}
展示
姓名 收藏了此直播间
也有两种实现方式
1.主动调用SDK内部方法上行消息,不过这样无法存储收藏信息
2.调用接口 服务器存储收藏信息然后调用IM上行API广播信息,这样用户就可以通过服务器查看自己的收藏列表了。
5 消息测试
由于客户服务器暂未部署,请使用云视节点进行测试,如下
APP
http://119.3.175.237:30200/api/machine/getAppNode
WEB
http://119.3.175.237:30200/api/machine/getWebNode
测试目前可通过两种方式进行:
SDK上行方式
1.按照上面定义的action拼接对应content 发送到对应直播间
2.定义其他类型的action(大于1000) 构造对应format的content发送
接口方式
1.调用云视给出的动作接口(部署完后可测试,目前给出禁言示例)
https://alpha-dazzle.yunshicloud.com/xyapi/api/liveRoom/anchor/v1/forbiddenFans?companyId=ysxw&userId=5bbbadd68b05120016f10a14&appCode=ysxw
json参数
{
"liveRoomId":"5e9a6b8a989edb00069ec1e2",
"fansId":"5e575ff561b9f0000726b9cf",
"time":-1
}
此示例目前不支持参数更换,测试请将SDK中对应的 companyId appcode groupId 替换后发送信息即可收到
2.调用IM上行消息接口测试
http://119.3.175.237:30200/api/msg/receive/pushToGroup?companyId=ysxw&appCode=ysxw
{
"messageId": "messageId-124",//消息ID 自行生成
"action": "1004",//动作
"content": "自定义消息",
"format": "text",
"timestamp": 1570025945,
"title": "title12121",
"extra": "extra-drgsdr",
"groupId":"5e9a6b8a989edb00069ec1e2",
"sender": "system"//发送人ID 系统则为SYSTEM
}
这个示例的 companyId appcode groupId 可以替换成任意的,参数构造同上,action小于1000时 按照定义好的类型构造,1000以上随便构造保证format和content一致即可。