收消息又分两种:1.即时消息和历史消息
即时消息就是在线的时候,对方发给你的消息。这主要是在上一篇里面的onMsgNotify方法里面获取。
历史消息就是你和某个用户聊过的最近7天的聊天记录。
我就主要写一下获得和指定用户的历史聊天记录,毕竟,即时消息获得的方法,上一篇有了嘛。
webim.getC2CHistoryMsgs(option,cbOk,cbErr);//主要是这个方法
var options = {
'Peer_Account': userId, //指定的好友帐号
'MaxCnt': reqMsgCount,//拉取的消息数目
'LastMsgTime': lastMsgTime,//上一次拉取的时间 在第一次拉去消息的时候,这里必须为0
'MsgKey': msgKey
}
var selSess = null;
webim.getC2CHistoryMsgs(
options,
function (resp) {
console.log(resp)
var complete = resp.Complete; //是否还有历史消息可以拉取,1-表示没有,0-表示有
if (resp.MsgList.length == 0) {
return
}
//拉取消息后,要将下一次拉取信息所需要的东西给存在缓存中
wx.setStorageSync('lastMsgTime', resp.LastMsgTime);
wx.setStorageSync('msgKey', resp.MsgKey);
var msgList = resp.MsgList;
for (var j in msgList) { //遍历新消息
var msg = msgList[j];
if (msg.getSession().id() == userId) { //为当前聊天对象的消息
selSess = msg.getSession();
//在聊天窗体中新增一条消息
that.addMsg(msg)
}
}
//消息已读上报,并将当前会话的消息设置成自动已读
webim.setAutoRead(selSess, true, true);
},
)
这里面其实最主要的方法是就是里面的addMsg。不管是收最新的消息,还是历史消息,都是需要解析后,才能再屏幕上展示的。
//处理消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息) 我这里是只要私聊的
addMsg:function(msg){
var that = this;
var fromAccount, fromAccountNick, sessType, subType;
fromAccount = msg.getFromAccount();
if (!fromAccount) {
fromAccount = '';
}
fromAccountNick = msg.getFromAccountNick();
if (!fromAccountNick) {
fromAccountNick = fromAccount;
}
//解析消息
//获取会话类型
//webim.SESSION_TYPE.GROUP-群聊,
//webim.SESSION_TYPE.C2C-私聊,
sessType = msg.getSession().type();
//获取消息子类型
//会话类型为群聊时,子类型为:webim.GROUP_MSG_SUB_TYPE
//会话类型为私聊时,子类型为:webim.C2C_MSG_SUB_TYPE
subType = msg.getSubType();
switch (sessType) {
case webim.SESSION_TYPE.C2C: //私聊消息
switch (subType) {
case webim.C2C_MSG_SUB_TYPE.COMMON: //c2c普通消息
//业务可以根据发送者帐号fromAccount是否为app管理员帐号,来判断c2c消息是否为全员推送消息,还是普通好友消息
//或者业务在发送全员推送消息时,发送自定义类型(webim.MSG_ELEMENT_TYPE.CUSTOM,即TIMCustomElem)的消息,在里面增加一个字段来标识消息是否为推送消息
that.convertMsg(msg);//解析方法
break;
}
break;
}
}
convertMsg:function(msg){
var that = this;
var elems, elem, type, content, isSelfSend;
var loginInfo = that.data.loginInfo;//自己的资料
var friendInfo = that.data.friendInfo;//对方的资料,这里要特别注意一下,消息里面是不会返回双方的头像和昵称的,只能通过指定的方法得到。
elems = msg.getElems();
isSelfSend = msg.getIsSend(); //消息是否为自己发的 true是自己发送,
var sess = msg.sess;
var currentMsg = {}; //设置消息数组,存消息
var currentMsgsArray = that.data.currentMsgsArray;
var allChatList = that.data.allChatList;
for (var i in elems) {
elem = elems[i];
type = elem.getType();
content = elem.getContent();
switch (type) {
case webim.MSG_ELEMENT_TYPE.TEXT:
var msgContent = that.convertTextMsg(content);
var msgTime = msg.getTime();//得到当前消息发送的时间
//得到当天凌晨的时间戳
var timeStamp = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
var thisdate;
var d = new Date(msgTime * 1000); //根据时间戳生成的时间对象
var min = d.getMinutes();
var hour = d.getHours();
//得到时和分,分小于10时,只返回一位数
if (min < 10) {
min = "0" + min;
}
//得到月份和天 月份一般是从0开始,所以展示出来要+1
var month = d.getMonth();
var day = d.getDate();
//得到时间 当天时间应该只显示时分 当天以前显示日期+时间
if (timeStamp > msgTime) {
thisdate = ((month + 1) + '-' + day + ' ' + hour + ":" + min);
} else {
thisdate = (hour + ":" + min);
}
currentMsg.msgContent = msgContent;//当前消息的内容
currentMsg.msgTime = thisdate;
currentMsg.isSelfSend = isSelfSend;
//根据是否自己发送的消息,设置双方的头像
if (isSelfSend) {
currentMsg.avatarUrl = loginInfo.headurl;
} else {
currentMsg.avatarUrl = friendInfo.src;
}
//然后将每一条聊天消息push进数组
currentMsgsArray.push(currentMsg);
that.setData({
currentMsgsArray: currentMsgsArray,
})
break;
}
}
}
腾讯云IM中,获得用户头像要在另一个方法中获得,所以,在一开始拉取历史消息时,就应该先获取到用户的头像。
——– 2018.07.05
腾讯云IM中获取用户头像的方法:
主要的方法是:webim.getProfilePortrait(options,cbOk,cbErr);
options里面主要是id和profileitem,根据官方文档指示,大概是:
{
"To_Account":["id1"], //需要获得资料的用户的id
"TagList":
[
"Tag_Profile_IM_Nick"//比如这就是昵称。我们这边主要是需要头像和昵称
]
}
var tag_list = new Array();
tag_list.push("Tag_Profile_IM_Nick");
tag_list.push("Tag_Profile_IM_Image");
var options = {};
var account = new Array();
var userId = selSess.getFromAccount();
account.push(userId);
options.To_Account = account;
options.TagList = tag_list;
//现目前只记起这种书写方式 --!然后
webim.getProfilePortrait(
options,
function (res) {
//这里面的数据就是用户的资料了,当然是获得的你所写了的资料
var UserProfileItem = res.UserProfileItem;
//嗯,是个数组
var C2cNick, C2cImage;
for (var i = 0; i < UserProfileItem.length; i++) {
var data = UserProfileItem[i].ProfileItem;
C2cNick = data[0].Value;
C2cImage = data[1].Value;
}
})
发消息的话主要使用的方法是 webim.sendMsg,可以发送文本信息,图片,语音等等,但是基于小程序的话,图片语音信息可能要麻烦的多。所以,在这里,我们只做了发送文字和表情包。表情包可以自定义表情包。
发消息主要用的方法是 webim.sendMsg;
消息可以发送给群,也可以发送给私人。
在我们得到消息内容(文字or表情)后,可以先判断消息的长度(如果不做限制则可以不判断)
var maxLen = webim.MSG_MAX_LENGTH.C2C;//得到私聊消息的最长长度
然后就配置消息的一些内容,比如新建一条发送给某人的消息,这里要得到对方的id(服务器配置),对方的头像,消息类型,时间等。
var selSess = new webim.Session(selType,userId);
//selType 主要分群聊、私聊两种
//群聊:webim.SESSION_TYPE.GROUP 私聊:webim.SESSION_TYPE.C2C
然后就可以来发送消息了
var isSend = true; //是否为自己发送
var seq = -1; //消息序列,-1表示 SDK 自动生成,用于去重
var random = Math.round(Math.random() * 4294967296); //消息随机数,用于去重
var msgTime = Math.round(new Date().getTime() / 1000); //消息时间戳
var subType; //消息子类型
if (subType == webim.SESSION_TYPE.C2C) {
subType = webim.C2C_MSG_SUB_TYPE.COMMON;
}
var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick);
var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex;
//解析文本和表情
var expr = /\[[^[\]]{1,3}\]/mg;
var emotions = text_content.match(expr);
if (!emotions) {
text_obj = new webim.Msg.Elem.Text(text_content);
msg.addText(text_obj);
}
webim.sendMsg(msg, function (resp) {
if (selType == webim.SESSION_TYPE.C2C) {
that.addMsg(msg);//这个方法上面有
console.log("发送成功")
that.setData({
text_content: "",
})
}
}, function (err) {
console.log(err.ErrorInfo);
})
到这里,收发消息就告一段落了。
值得注意的是,调试的时候,可以在模拟器上console出来,但是真机上是不能console.log的,会报错(不知道现在修复没有,反正当初我测试的时候是会报错的。)
附上腾讯2017新版动态表情的base64地址的js链接(适合用在腾讯云IM上,哈哈) 下载链接