小程序聊天,极光 IM 拉取并缓存离线/实时消息

文章目录

    背景

    由于 ios 和 Android 客户端都集成了极光 IM 的 SDK 来实现用户间聊天功能。
    所以,不得不在微信小程序中继续使用极光 SDK。

    离线消息拉取并缓存逻辑

    两种方案:

    • 小程序段每次登陆成功之后,调用离线消息同步。但是这是增量更新的,无法拉取所有的历史数据,最近 15 天内的离线消息。要自己写本地缓存逻辑。
    • restful api,这个虽然比客户端的接口要方便很多,但是并不适合在客户端调用,因为 token 会暴露 secret 。而且作为实时聊天功能,我觉得 15 天不登录,那这种消息也没有保留的价值。

    所以,我最终选择了第一种方案。

    参考
    https://community.jiguang.cn/article/306791

    app.js 中调用这个封装即可:

      /**
       * 离线消息同步
       **/
      onSyncConversation: function() {
        this.globalData.jim.onSyncConversation(data => {
          console.log(data);
          for (let msg of data) {
            this.cacheMsg(msg, "history")
          }
        });
      },
    

    实时消息监听逻辑

    跟离线消息类似,依次写入本地 storage 作为历史消息缓存。

      /**
       * 实时消息监听
       **/
      onMsgReceive: function() {
        this.globalData.jim.onMsgReceive(data => {
          console.log(data);
          this.cacheMsg(data, "realtime")
        });
      },
    

    消息的解析

    由于离线消息和实时消息返回的数据结构不一样,并且返回的无用字段比较多,为了节省本地空间,我决定只保留每条消息的三个字段:

    • 消息类型
    • 消息内容
    • 发送时间

    storage key 为前缀加发送人 id。

    解析缓存逻辑:

      cacheMsg: function(msg, msg_type) {
        let msgs = null;
        let history_username = null;
        if (msg_type == "history") {
          history_username = msg.from_username;
          msgs = msg.msgs;
        } else {
          msgs = msg.messages;
        }
    
        for (let msg of msgs) {
          let key = null;
          if (msg_type == "history") {
            key = "xxx_con_" + history_username;
          } else {
            key = "xxx_con_" + msg.from_username;
          }
          let historys = wx.getStorageSync(key);
          if (!historys) {
            historys = [];
          }
    
          historys.push({
            type: msg.content.msg_type,
            body: msg.content.msg_body,
            time: msg.content.create_time,
          })
          wx.setStorageSync(key, historys);
        }
      },
    

    消息缓存空间的上限

    同一个微信用户,同一个小程序 storage 上限为 10MB。

    参考:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/storage.html

    所以有必要对缓存的消息条数做个限制。

    建议

    如果没有使用极光,强烈不推荐使用极光的小程序 SDK。原因是:

    • 没有小程序接入文档。完全靠猜,自己摸索。浪费时间。
    • 没有小程序 Demo。也就是说官方人员都没有试过到底好不好使。那这个 SDK 谁敢用。
    • 很多极光论坛里反馈的小程序问题,官方人员装傻,视而不见。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式