IMSDK对接(临时)

820 阅读8分钟

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一致即可。