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

更新日期: 2020-11-05 阅读次数: 3116 字数: 618 分类: 微信小程序

背景

由于 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 聊聊, 查看更多联系方式