腾讯即时通讯IM的WebSDK不支持createAudioMessage, 只有小程序才能用. 经查在 tim-js-friendship.js下的createAudioMessage里 做了是否为小程序的判断,
key: "createAudioMessage", value: function (e) {
if (ni) { // 如果是小程序, 创建 audio message
var t = e.payload.file;
if (ni) {
var n = {
url : t.tempFilePath,
name : t.tempFilePath.slice(t.tempFilePath.lastIndexOf("/") + 1),
size : t.fileSize,
second: parseInt(t.duration) / 1e3,
type : t.tempFilePath.slice(t.tempFilePath.lastIndexOf(".") + 1).toLowerCase()
};
e.payload.file = n
}
var o = this.getMyUserID();
e.currentUser = o;
var r = new Om(e), a = new gm({
second: Math.floor(t.duration / 1e3),
size : t.fileSize,
url : t.tempFilePath,
uuid : this._generateUUID()}),
s = this._getNickAndAvatarByUserID(o);
return r.setElement(a), r.setNickAndAvatar(s), r.setNameCard(this._getNameCardByGroupID(r)), this._messageOptionsMap.set(r.ID, e), r
}
...
不是小程序的时候需要加上以下代码
else {
var t = e.payload.file;
t.files = [t];
var o = this.getMyUserID();
e.currentUser = o;
var r = new Om(e), a = new gm({
second: t.duration,
size : t.size,
url : t.tempFilePath,
uuid : this._generateUUID()
}),
s = this._getNickAndAvatarByUserID(o);
return r.setElement(a), r.setNickAndAvatar(s), r.setNameCard(this._getNameCardByGroupID(r)), this._messageOptionsMap.set(r.ID, e), r
}
外部调用的时候传入File, 并给File设置duration字段(单位秒)
const file = new File([data.blob], data.id, {type: data.blob.type}); // 创建file
file.duration = duration; // 给file设置时长(单位秒)
// 创建audio message
const message = this.tim.createAudioMessage({
to : this.toAccount,
conversationType: this.currentConversationType,
payload : {
file: file
},
onProgress : percent => {
this.$set(message, 'progress', percent) // 手动给message 实例加个响应式属性: progress
}
});
// 发送音频消息
this.tim.sendMessage(message).then(() => {
}).catch(error => {
});
这样就可以在web端发送音频消息了.
顺便鄙视下腾讯的技术和产品, 挺简单的东西 就是不给加, 强推垃圾又难用的小程序.