错题集
更新时间: 2024/08/01 16:12:13
本文汇总了网易云信即时通讯 SDK(简称 NIM SDK)的开发者在使用 SDK 过程中的易错问题以及对应的解决思路,帮助您避开其他开发者已踩过的坑,为您的开发提效加速。
为什么重新连接后获取到的会话数减少?
问题描述
断连后重新连接 NIM SDK 时,获取的会话列表中,会话数减少。
问题原因
NIM SDK 设计原理:为了减少服务器的压力,若本地内存中有漫游时间戳(此前登录过),那么再次登录后只同步增量数据。
解决方案
- 用户调用
disconnect
后,再调用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 标签中即可播放。
JavaScripte.data.type = "audio"
单击点开查看 Dom 示例和 JavaScript 参考示例。
HTML//1. 本地录音并把录音数据通过 Blob 方式上传到网易对象存储 NOS
//Dom 示例
<buttononclick="start()">Start</button>
<buttononclick="stop()">Stop</button>
<div id="div"></div>
JavaScript//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()
})
}
HTML//2. 对端展示 audio 的时长获取
<audio id="12121" controls>
<source src="文件收到时消息体里面的 url" type=" audio/wav">
</audio>
JavaScriptlet 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
字段获取具体内容。
此文档是否对你有帮助?