进入主题前先吐槽一下融云,真的不是我说很垃圾,客服回应慢(这个是真的垃圾,每一个工单必须1个小时以后回复,感觉就是卡着点回复你,然后想让你打电话给融云,但是电话技术支持很贵的,一次差不多80),demo不更新,文档不清晰。
还是进入正题了,没办法, 谁让老大就要用这个呢,腾讯云那么好的SDK不用,瞎整。
我们的项目业务跟融云demo很相似,所以我就直接拿进来使用,自己修改。
把融云整个demo拉进来
连接融云,页面中引入融云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三个参数即可
小程序发送语音需要使用自定义发送,我在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()这个方法播放的