【小程序】微信小程序使用腾讯云IM(二):收发信息

消息分两种消息:1,收消息,发消息

1.收消息

收消息又分两种: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;
     }
 })

2.发消息

发消息的话主要使用的方法是 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上,哈哈) 下载链接

你可能感兴趣的:(小程序)