微信小程序中接入融云IM

2,831 阅读4分钟

进入主题前先吐槽一下融云,真的不是我说很垃圾,客服回应慢(这个是真的垃圾,每一个工单必须1个小时以后回复,感觉就是卡着点回复你,然后想让你打电话给融云,但是电话技术支持很贵的,一次差不多80),demo不更新,文档不清晰。

还是进入正题了,没办法, 谁让老大就要用这个呢,腾讯云那么好的SDK不用,瞎整。

我们的项目业务跟融云demo很相似,所以我就直接拿进来使用,自己修改。

把融云整个demo拉进来

在融云官网注册,小程序IM需要5000块钱或者企业认证就可以使用,但是上线的话必须5000才可以使用。拿到appkey在config.js中配置appkey

连接融云,页面中引入融云SDk

const RongIMLib = require('../lib/RongIMLib.miniprogram-1.1.3.js')
const RongIMClient = RongIMLib.RongIMClient
const Config = require('../../config.js')
const Service = require('../services.js')(Config)
const { Status, Conversation } = Service

登录账号

<!--获取聊天列表-->
  watchConversation(context) {
    Conversation.watch(conversationList => {
      context.setData({
        conversationList
      })
    })
  },

  // 状态检查
  watchStatus() {
    Status.watch(status => {
      // 网络不可用,重新连接融云
      if (status == 3) {
        // 个人信息
        let local = JSON.parse(wx.getStorageSync('personalMessage'))
        <!--这个逻辑是我登录app账号后,拿到自己的头像名字,token等,传给融云,进行登录-->
        api.myInfo({ token: local.token }, function(res) {
          let result = res.result.memberInfo
          api.getToken({ token: local.token }, function(res1) {
            let name = result.name
            let token = res1.result.token
            let memberId = result.memberId
            let headImage = result.headImage
            let userInfo = {
              nickName: name,
              type: 1,
              token: token,
              id: memberId,
              avatarUrl: headImage
            }
            <!--登录融云-->
            Status.connect(userInfo)
          })
        })
      }
    })
  },

  //连接融云服务器
  connect(context) {
    this.watchConversation(context)
    this.watchStatus()
    // 个人信息
    let local = JSON.parse(wx.getStorageSync('personalMessage'))
    <!--这个逻辑是我登录app账号后,拿到自己的头像名字,token等,传给融云,进行登录-->
    api.myInfo({ token: local.token }, function(res) {
      let result = res.result.memberInfo
      api.getToken({ token: local.token }, function(res1) {
        let name = result.name
        let token = res1.result.token
        let memberId = result.memberId
        let headImage = result.headImage
        let userInfo = {
          nickName: name,
          type: 1,
          token: token,
          id: memberId,
          avatarUrl: headImage
        }
        Status.connect(userInfo).then(
          () => {
            //此处会去services.js找相应的方法
            console.log('connect successfully')
            <!--此时就登录融云成功,后提示连接成功-->
          },
          error => {
            console.log(error)
          }
        )
      })
    })
  },

在service中创建一个空的数组,存放你的聊天列表let UserList = [],然后在获取聊天消息api中push每一个用户并且渲染,我的逻辑是拿到targetId后到自己后台去查这个用户的头像昵称

进入聊天详情跳转需要携带参数type==1是单聊,3是群聊,targetId,title三个参数即可

图片最上面storage是区分当前我是跟谁聊天,如果不加这个,在聊天中会出现信息紊乱现象,就类似于群聊的效果,下面会继续介绍,这里的target必须添加。 进入到聊天页面就成功了,但是融云微信小程序的发送语音有问题,需要自己实现逻辑,用小程序自带的录音功能录音,然后上传到服务器,播放的时候用微信小程序自带的语音播放来实现,但是这里有一个前提,就是安卓,iOS,微信小程序都需要用aac格式上传音频,iOS跟安卓是用的高清模式,三端必须统一才可以,否则就是app端是加密的base64格式,小程序是url地址方式。

小程序发送语音需要使用自定义发送,我在service中穿件一个自定义发送语音消息,自定义消息最好是在init之前connect之后,

// 自定义消息发送语音
let registerMessages = () => {
  // let messageName = "MusicMessage";
  // let objectName = "seal:music";
  // let mesasgeTag = new RongIMLib.MessageTag(true, true);
  // let prototypes = ["url", "name", "author", "poster"];
  // RongIMClient.registerMessageType(messageName, objectName, mesasgeTag, prototypes);
  var messageName = 'voiceMine' // 消息名称
  var objectName = 'RC:HQVCMsg' // 消息内置名称,请按照此格式命名
  var isCounted = true // 消息计数
  var isPersited = true // 消息保存
  var mesasgeTag = new RongIMLib.MessageTag(isCounted, isPersited)
  var prototypes = ['remoteUrl', 'duration'] // 消息类中的属性名
  RongIMClient.registerMessageType(
    messageName,
    objectName,
    mesasgeTag,
    prototypes
  )
}

messageName 自己自定义,在消息页自己需要操作,用这个值渲染,然后需要修改组件components下面的message下面的voice,我试用的是let innerAudioContext = wx.createInnerAudioContext()这个方法播放的

播放

录音

录音完成后发送语音消息一定要用自定义消息,这样就ok了。

最后说一下前面提到的聊天紊乱现象,原因是因为接收消息没有对用户进行判断,不管是跟谁聊天,只要有新消息接入都会直接渲染,所以我们要判断一下target是不是当前人的然后再进行渲染

本文完全自创,可能没有完全代码,需要的我们可以交流