错题集

更新时间: 2024/03/14 18:45:32

本文汇总了云信 IM 即时通讯的开发者在各个场景实践过程中的易错问题以及对应的解题思路,帮助您避开别人踩过的坑,为您的开发提效加速。

为什么重新连接后获取到的会话数减少?

问题描述

断连后重新连接 NIM SDK 时,获取的会话列表中,会话数减少。

问题原因

NIM SDK 设计原理:为了减少服务器的压力,若本地内存中有漫游时间戳(此前登录过),那么再次登录后只同步增量数据。

解决方案

  • 用户调用 disconnet 后,再调用 destroy 清除示例,然后再重新初始化实例,这样再次重连就可以获取到完整的最近会话。
  • 本地第一次触发回调时,将获取到的所有会话,在用户业务上保存一份,再次获取到增量会话后,将保存的内容添加到原会话数据中即可。

为什么发送语音消息失败?

问题描述

用户调用 nim.sendFile 接口发送语音消息失败,报错信息如下:

"Uncaught (in promise) " {callFunc: "msg::_doPreviewFile", message: "缺少参数 filePath, 请确保参数不是 空字符串、空对象、空数组、null或undefined, 或数组的内容不是 null/undefined", time: {}, timetag: 1661839932287}

问题原因

调用 nim.sendFile 接口发送语音消息时,Blob(Binary Large Object) 对象出现问题。

解决方案

通过 Blob 方式上传录音数据时,增加以下代码后,远端将 audio 链接放在 audio 标签中即可播放。

e.data.type = "audio"
参考示例
//1. 本地录音并把录音数据通过 Blob 方式上传到 NOS

//dom示例
<buttononclick="start()">Start</button>
<buttononclick="stop()">Stop</button>
<div id="div"></div>

//js代码示例
  let mediaStream
  let mediaRecorder
  let chunks = []
  const start = async ()=>{
    mediaStream = await navigator.mediaDevices.getUserMedia({audio: true})
    mediaRecorder = new MediaRecorder(mediaStream)
    mediaRecorder.ondataavailable = function(e) {
      console.log("ondataavailable", e)
      chunks.push(e.data);
      e.data.name = "test"
      e.data.type = "audio"
      const blob = new Blob(chunks);
      const url = URL.createObjectURL(blob);
      const audio = document.createElement("audio")
      audio.src = url
      audio.controls = true
      audio.id='test'
      document.getElementById("div").append(audio)
      //这里的nim实例是指IMgetInstance登录之后的实例
      nim.sendFile({
            scene: 'p2p',
            to: 'xiaodong1',
            type: 'audio',
            blob: chunks[0],
            uploadprogress: function(obj) {
                console.log('文件总大小: ' + obj.total + 'bytes');
                console.log('已经上传的大小: ' + obj.loaded + 'bytes');
                console.log('上传进度: ' + obj.percentage);
                console.log('上传进度文本: ' + obj.percentageText);
            },
            uploaddone: function(error, file) {
                console.log('上传' + (!error?'成功':'失败'), error, file);
            },
            beforesend: function(msg) {
                console.log('正在发送p2p image消息, id=' + msg.idClient);
            },
            done: sendMsgDone
        });

    function sendMsgDone(error, msg) {
                console.log('发送' + msg.scene + ' ' + msg.type + " " + msg.text + '消息' + (!error ? '成功' : '失败') + ', id=' + msg.idClient, error, msg);
            }
    }
    mediaRecorder.start()
  }
  const stop = ()=>{
    mediaRecorder.stop()
    mediaStream.getTracks().forEach((t)=>{
      t.stop()
    })
  }

//2. 对端展示 audio 的时长获取

<audio id="12121" controls>
  <source src="文件收到时消息体里面的url" type=" audio/wav">
</audio>
let audio=document.getElementById('12121');
audio.currentTime=10000000*Math.random()
audio.oncanplay=function(){
console.log(audio.duration);
};

为什么客户端消息发送方无法获取第三方回调的扩展字段?

问题描述

用户在服务端对 IM 消息,进行了拦截,并设置了三方回调的扩展字段,但是客户端的消息发送方获取不到该扩展字段。

问题原因

只有服务端responseCode返回 200 时,客户端才能读取callbackExt的内容。

解决方案

将服务端的responseCode设置为 200,其他信息以 json 的形式放在callbackExt中,客户端在回调中的消息对象的 custom 字段获取具体内容。

此文档是否对你有帮助?
有帮助
去反馈
  • 为什么重新连接后获取到的会话数减少?
  • 为什么发送语音消息失败?
  • 为什么客户端消息发送方无法获取第三方回调的扩展字段?