基于极光JMessage的点对点聊天应用(多通道)设计【系列终】

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

依托现有账户体系实现多公司多通道客服渠道聚合

UC设计

image.png

简要描述一下:
  1. 通过内部管理系统IMS 以维护公司增值服务的动作来完成对于公司内极光账号的初始化,此处调用极光IM提供的rest API 里批量注册用户的接口,初始化公司客服账号,并进行持久化存储形成 公司-账户(通道) 表
  2. 维护公司菜单,添加客服管理列表菜单
  3. 在列表上,建立客服账号与用户之间的关联,并持久化存储 ,形成 用户-公司-账户表的关联表
  4. 在pc客户端,通过服务的统一鉴权认证,获取token
  5. 调用接口,获取当前账户所关联的客服通道列表
  6. 基于列表,初始化JIM实例,并进行登录操作,此处需要借助全局状态管理工具,将多实例维护在全局
  7. 注册全局消息接收发送处理
  8. 历史记录统一处理

多通道实例化及全局状态管理维护

// 伪代码
let msgInstanceMap = {}
msgArray.map(msg => {
  let JIM = new JMessage({ debug: true })
  // 根据返回的通道列表初始化极光IM SDK 并登录
  JIM.login(....)
  msgInstanceMap[msg.name] = JIM
  this.SET_INSTANCE(msgInstanceMap)
})

统一收发消息

export function onMsgReceive () {
  for (let JIM in msgInstanceMap) {
    JIM.onMsgReceive((data) => {
      // data.messages[]
      // data.messages[].ctime_ms
      // data.messages[].msg_type 会话类型
      // data.messages[].msg_id
      // data.messages[].from_appey 单聊有效
      // data.messages[].from_username 单聊有效
      // data.messages[].from_gid 群聊有效
      // data.messages[].need_receipt
      // data.messages[].content
      // data.messages[].custom_notification.enabled
      // data.messages[].custom_notification.title
      // data.messages[].custom_notification.alert
      // data.messages[].custom_notification.at_prefix
    })
  }
}
export function onMsgSend (JIM) {
  JIM.sendSingleMsg({
    'target_username': 'xiezefan',
    'content': 'Hi, JiGuang '
  }).onSuccess(function (data) {
  // do something
  }).onFail(function (data) {
  // do something
  }).onTimeout(function (data) {
    if (data.response_timeout) {
      // do something when response timeout
    } else {
      // do something when request timeout
    }
  }).onAck(function (data) {
  // do something
  })
}
// 拉取合并会话列表
export function mergeConversationList () {
  let conversationList = []
  for (let JIM in msgInstanceMap) {
    JIM.getConversation().onSuccess((data) => {
      // data.code 返回码
      // data.message 描述
      // data.conversations[] 会话列表,属性如下示例
      // data.conversations[0].extras 附加字段
      // data.conversations[0].unread_msg_count 消息未读数
      // data.conversations[0].name  会话名称
      // data.conversations[0].appkey  appkey(单聊)
      // data.conversations[0].username  用户名(单聊)
      // data.conversations[0].nickname  用户昵称(单聊)
      // data.conversations[0].avatar  头像 media_id
      // data.conversations[0].mtime 会话最后的消息时间戳
      // data.conversations[0].gid 群 id(群聊)
      // data.conversations[0].type  会话类型(3 代表单聊会话类型,4 代表群聊会话类型)
      conversationList.push(...data)
      this.SET_CONVERSATION_LIST(conversationList)
    }).onFail(function (data) {
      // data.code 返回码
      // data.message 描述
    })
  }
}

结语: 到这个时候,我们就完成了点对点聊天多通道的管理。